回答編集履歴

1

回答コメントを受けて追記

2018/07/20 05:06

投稿

nak
nak

スコア696

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
+ でやりたいことは実現できたのではないかと(※動作未検証です)。