質問するログイン新規登録

回答編集履歴

1

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

2018/07/20 05:06

投稿

nak
nak

スコア696

answer CHANGED
@@ -10,4 +10,61 @@
10
10
  ⇒(1)からお読みいただければと思いますが、実際にやりたいことは(2)に詳しく記載されていると思います。
11
11
 
12
12
  なお、こちら、ZendFramework1の記事です。
13
- ZendFramework2の場合、少し設定方法が異なる可能性があります(その場合、「ZendFramework2 カスタムルーティング」等のキーワードで検索していただくと、役に立つ記事がHITするかと思われます)。
13
+ ZendFramework2の場合、少し設定方法が異なる可能性があります(その場合、「ZendFramework2 カスタムルーティング」等のキーワードで検索していただくと、役に立つ記事がHITするかと思われます)。
14
+
15
+ ---
16
+
17
+ 回答へのコメントを受けて。
18
+
19
+ 「どのURLだったら、どのコントローラーのどのメソッドを呼ぶか」を制御しているのがルーティングです。
20
+
21
+ ZFのデフォルトのルーティングは、wan_wanさんご自身も書かれているとおり
22
+ http://www.mydomain.com/{controller}/{action}/{parameter_name}/1
23
+ ですので、ルーティングを変更せずに
24
+ http://www.mydomain.com/{controller}/1
25
+ と実行すると、{controller}Controllerの"1Action"というメソッドを呼ぼうとしてしまいます。
26
+
27
+ この動作を変えるにはカスタムルーティングをするしかありません。
28
+ 呼び出すコントローラー&メソッドを決定するルールを変更しなければならないので、少なくとも、コントローラー=呼び出される側では制御不能ですし、頑張って「ZF標準のカスタムルーティング」以外の方法を探したとしても、どうしても「サイト全体で使用するファイル」を修正することになると思います。
29
+
30
+ なお、カスタムルーティングはURLパターン毎に設定をするため、基本的には設定したURLパターン以外には影響を及ぼさないはずです(設定を誤ってフレームワーク全体でエラーが発生してしまった、といったケースを除く)。
31
+
32
+
33
+ なお、トリッキーな実装になってしまうのでおススメはしませんが……。
34
+ もし、引数が数字から始まるものでなければ、コントローラー内でマジックメソッド `__call` を使用し、実際には存在しないAction(aActionやbAction等)を呼ばれた時の動作を `__call`メソッドで拾って処理する、という方法もあったかと思います。
35
+
36
+ `アクセス不能メソッドを実行する__call()と__callStatic()の使い方`
37
+ [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)
38
+
39
+
40
+ ただし、PHPのメソッド命名規約に「メソッド名の一文字目に、数字は使えない」というものがあるため、パラメータが数字の場合はこの方法は使えません(http://www.mydomain.com/hoge/1 の場合 "1Action"を呼ぼうとする⇒規約違反でエラーになるため)。
41
+
42
+ メソッドの定義と命名規則
43
+ [http://alphasis.info/2012/07/php-oop-method/](http://alphasis.info/2012/07/php-oop-method/)
44
+
45
+
46
+ `__call` を使った実装例)
47
+ http://www.mydomain.com/hoge/a
48
+ http://www.mydomain.com/hoge/b
49
+
50
+ ⇒これらにアクセスしようとするとHogeControllerのaActionやbActionを呼ぼうとするので、
51
+
52
+ ```php
53
+ class HogeController
54
+ {
55
+ public function __call($name, $args)
56
+ {
57
+ if (strpos($name, "Action") !== false) {
58
+ // メソッド名(aActionやfugaAction)から"Action"という文字列を削除したものが、実際に欲しいパラメータ
59
+ $id = str_replace("Action", "", $name);
60
+ return $this->defaultAction($id);
61
+ }
62
+ }
63
+
64
+ private function defaultAction($id) {
65
+ // 実際にやりたい処理
66
+ }
67
+ }
68
+ ```
69
+
70
+ でやりたいことは実現できたのではないかと(※動作未検証です)。