名前付きでパラメータを受け取る方法

1.2系での話です。(バージョンはBeta 1.2.0.6311)

通常

PostsControllerのhogeメソッドにアクセスする時のURLは

http://localhost/posts/hoge

となります。

ここに何かしらのパラメータを渡そうとするとhogeメソッドに

<?php
funcion hoge($param1 , $param2){
    // 処理
}
?>

と引数を受け取れるように定義した上で

http://localhost/posts/hoge/10/20

というURLにアクセスすると、hogeメソッドの引数$param1に10、$param2に20がセットされます。


パラメータの数がいつも変わらなければこの方法で十分なのですが、パラメータの個数が不特定の場合に困ってしまいます。

そんな悩みを解消するのが次の方法です。

名前付きのパラメータとして受け取る方法


先ほどと同じお題でいくと

http://localhost/posts/hoge/param1:10/param2:20

というように、URLの後ろに"変数名:値"をつけると、コントローラーの変数$params['named'][変数名]に値が格納されます。

コントローラー内では

<?php
$this->params['named']['param1']; // 値は10
$this->params['named']['param2']; // 値は20
?>

といった風にアクセスできます。


この方法の場合、hogeメソッドでは引数の定義が必要なくなります。

下の例のようにデフォルト値を定義しておいてマージすると良いかと思います。

<?php
funcion hoge(){
    $defaults = array('param1'=> 0, 'param2'=> 0, 'param3'=> 0, ...);
    $p = array_merge($defaults, $this->params['named']);
    // 処理
}
?>


この方法はページネーションのページ番号/ソート項目/ソート順などのパラメータの受け取り方に使われています。

パラメータの個数・順番などに関係なくメソッド側で柔軟に対応できるので、この方法が便利なシーンもあるかと思います。


ちなみに

http://localhost/posts/hoge/param1:10/30/param2:20

といった感じで任意の場所に"値のみ"をURLに書いた場合、コントローラーの変数$params['pass'][0からの連番]に値が格納されます。

また、$params['pass']と$params['named']をマージしたものが、コントローラーの変数$passedArgsにセットされるようです。