回答編集履歴
1
回答コメントを受けて追記
test
CHANGED
@@ -23,3 +23,117 @@
|
|
23
23
|
なお、こちら、ZendFramework1の記事です。
|
24
24
|
|
25
25
|
ZendFramework2の場合、少し設定方法が異なる可能性があります(その場合、「ZendFramework2 カスタムルーティング」等のキーワードで検索していただくと、役に立つ記事がHITするかと思われます)。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
---
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
回答へのコメントを受けて。
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
「どのURLだったら、どのコントローラーのどのメソッドを呼ぶか」を制御しているのがルーティングです。
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
ZFのデフォルトのルーティングは、wan_wanさんご自身も書かれているとおり
|
42
|
+
|
43
|
+
http://www.mydomain.com/{controller}/{action}/{parameter_name}/1
|
44
|
+
|
45
|
+
ですので、ルーティングを変更せずに
|
46
|
+
|
47
|
+
http://www.mydomain.com/{controller}/1
|
48
|
+
|
49
|
+
と実行すると、{controller}Controllerの"1Action"というメソッドを呼ぼうとしてしまいます。
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
この動作を変えるにはカスタムルーティングをするしかありません。
|
54
|
+
|
55
|
+
呼び出すコントローラー&メソッドを決定するルールを変更しなければならないので、少なくとも、コントローラー=呼び出される側では制御不能ですし、頑張って「ZF標準のカスタムルーティング」以外の方法を探したとしても、どうしても「サイト全体で使用するファイル」を修正することになると思います。
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
なお、カスタムルーティングはURLパターン毎に設定をするため、基本的には設定したURLパターン以外には影響を及ぼさないはずです(設定を誤ってフレームワーク全体でエラーが発生してしまった、といったケースを除く)。
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
なお、トリッキーな実装になってしまうのでおススメはしませんが……。
|
66
|
+
|
67
|
+
もし、引数が数字から始まるものでなければ、コントローラー内でマジックメソッド `__call` を使用し、実際には存在しないAction(aActionやbAction等)を呼ばれた時の動作を `__call`メソッドで拾って処理する、という方法もあったかと思います。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
`アクセス不能メソッドを実行する__call()と__callStatic()の使い方`
|
72
|
+
|
73
|
+
[http://www.atmarkit.co.jp/ait/articles/1509/03/news021_2.html#04](http://www.atmarkit.co.jp/ait/articles/1509/03/news021_2.html#04)
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
ただし、PHPのメソッド命名規約に「メソッド名の一文字目に、数字は使えない」というものがあるため、パラメータが数字の場合はこの方法は使えません(http://www.mydomain.com/hoge/1 の場合 "1Action"を呼ぼうとする⇒規約違反でエラーになるため)。
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
メソッドの定義と命名規則
|
84
|
+
|
85
|
+
[http://alphasis.info/2012/07/php-oop-method/](http://alphasis.info/2012/07/php-oop-method/)
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
`__call` を使った実装例)
|
92
|
+
|
93
|
+
http://www.mydomain.com/hoge/a
|
94
|
+
|
95
|
+
http://www.mydomain.com/hoge/b
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
⇒これらにアクセスしようとするとHogeControllerのaActionやbActionを呼ぼうとするので、
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
```php
|
104
|
+
|
105
|
+
class HogeController
|
106
|
+
|
107
|
+
{
|
108
|
+
|
109
|
+
public function __call($name, $args)
|
110
|
+
|
111
|
+
{
|
112
|
+
|
113
|
+
if (strpos($name, "Action") !== false) {
|
114
|
+
|
115
|
+
// メソッド名(aActionやfugaAction)から"Action"という文字列を削除したものが、実際に欲しいパラメータ
|
116
|
+
|
117
|
+
$id = str_replace("Action", "", $name);
|
118
|
+
|
119
|
+
return $this->defaultAction($id);
|
120
|
+
|
121
|
+
}
|
122
|
+
|
123
|
+
}
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
private function defaultAction($id) {
|
128
|
+
|
129
|
+
// 実際にやりたい処理
|
130
|
+
|
131
|
+
}
|
132
|
+
|
133
|
+
}
|
134
|
+
|
135
|
+
```
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
でやりたいことは実現できたのではないかと(※動作未検証です)。
|