ルーティング設定していると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を作ってから、一つずつ取り組むべし>俺