ルーティング設定しているとedit($id)の$idが空になる?(その2)
前回の続き
自分の単なる勘違いなどで、前回かなり混乱しているので、
まずは問題を整理。自分用にメモ。
結論としては、
(1)(現時点の自分には)2種類のRouter::connect設定は不要
(2)コントローラのメソッドの引数に入ってくるのは$this->params[pass]の値のみ
(3)一気に色々やろうとするから混乱する
(1)2種類のRouter::connect設定は不要
なんで2種類の設定を記述したのか...それは解らないまま色々試すうちに
2種類を記述した時点で動いたように見えたから。
本来なら「設定-2」で事足りている(はず)。
(2)メソッドの引数に入ってくるのは$this->params[pass]の値
ソースを見るとそういう仕様。
「:id」のように「:hoge」みたいにした場合は、$this->params['hoge']に格納される。
本やウェブ上のサンプルソースでコントローラメソッドの引数が
function edit() {
や
function edit($id = null) {
や
function edit($id) {
や
function edit($id, $fuga) {
だったりするのが、ずっと気になってたけど、要するに
/コントローラ/アクション/パラメータ1/パラメータ2/....
っと、パラメータの数によって変わるからだということを知った。
ソースを追って調べると、
各コントローラのアクションメソッドの呼び出し元
「cake/libs/object.php」のObjectクラス、
Object::dispatchMethod()を見ると引数の$params配列の要素数ごとにcaseで分岐している。
<?php function dispatchMethod($method, $params = array()) { switch (count($params)) { case 0: return $this->{$method}(); case 1: return $this->{$method}($params[0]); case 2: return $this->{$method}($params[0], $params[1]); case 3: return $this->{$method}($params[0], $params[1], $params[2]); case 4: return $this->{$method}($params[0], $params[1], $params[2], $params[3]); case 5: return $this->{$method}($params[0], $params[1], $params[2], $params[3], $params[4]); default: return call_user_func_array(array(&$this, $method), $params); break; } }
その呼び出し元である「cake/dispathcer.php」のDispatcherクラス、
Dispatcher::_invoke()内の$contoroller->dispatchMethod()で
渡しているデータは$params['pass']となっている。
<?php $output = $controller->dispatchMethod($params['action'], $params['pass']);
...そしてrouter.phpだったか?を見ると「:hoge」と設定したものは'pass'には入らない。
(3)一気に色々やろうとするから混乱する
ルート設定でのprefix指定やログイン認証など、一気に色々やるから
こんなことになる....と反省。
とりあえずはシンプルにCRUDを作ってから、一つずつ取り組むべし>俺