通常、パラメータの受け渡しはPOSTの場合はHIDDENタグで飛ばしたり、GETの場合はURLの最後に?foo=barのように書いて送信しますが、今時のサービスだと下記のようにURLの最後にスラッシュ区切りでパラメータを指定するようなものが多かったりします。
/app/test/123/itboy
上記の場合、123とitboyがパラメータ。
で、最初に書いたようなPOST/GETでのパラメータ送信は、Laravelでは通常コントローラでInput::get('パラメータ名')やInput::all()で全部受け取ったりすることが出来るんですけど、上記のようにスラッシュ区切りでのパラメータの受け渡しの場合、Inputで取得ができません。
※ Laravel4.2で検証してます。
以下、サンプルのプログラム。
Route::any('test/index/{id?}/{name?}', 'TestController@anyIndex');
public function anyIndex($id, $name)
{
var_dump($id, $name, Input::all());
}
結果(GET/POSTで同様)。
string(3) "123" string(5) "itboy" array(0) { }
アクションのメソッドの引数としては正常に受け取れるのですが、Input(Request::all()でも同様)を使ってリクエストを直接受け取ることができません。
また、当たり前ですけどPHP標準の$_POSTや$_GETなどのスーパーグローバル変数にもパラメータは格納されていません。
URL上の構成要素からLaravelのルーティングがここまでがURLで、ここからがパラメータという扱いをしているだけだと思うので、これは当然の仕様かもしれません。
URL内のスラッシュ区切りのパラメータを受け取る
ここからが本題なのですが、確かにコントローラで引数として受け取れるなら通常は問題ないわけですが、場合によりInput::get()とかリクエストを一緒くたに扱いたいといった場合があります。
そんなときに、無理やりInput::get()を使ってスラッシュ区切りのパラメータを受け取るやりかたなわけですけど、下記のようにすることで受け取ることができます。
public function anyIndex($id, $name)
{
$slashParams = Route::getCurrentRoute()->parameters();
Input::merge($slashParams);
var_dump(Input::all());
}
Route::getCurrentRoute()->parameters()にて、スラッシュ区切りのパラメータを受け取り、それをInput::merge()で無理やりInput内に取り込んでしまいます。
結果(GET/POSTで同様)。
array(2) { ["id"]=> string(3) "123" ["name"]=> string(5) "itboy" }
コンストラクタやbeforeFilter()などにうまく書いておけばより便利かもしれません。
1点、注意が必要なのが結果がルーティングの書き方によって変わってくるという点です。
最初のroute.phpのようにURL構成上のパラメータをそれぞれなんと言う変数名で受け取るかを指定していた場合は、正しくその変数名で受け取ることができるのですが、下記のようにコントローラベースのルーティングを書いていて、パラメータに対応する変数の指定がない場合にはパラメータ名がLaravelによって勝手に振られた名前になってしまいます。
Route::controller('test', 'TestController');
上記の場合、コントローラの引数で$idや$nameには正しくURL上のパラメータが格納されているのですが、Route::getCurrentRoute()->parameters()で受け取った結果は下記のようになります。
array(2) { ["one"]=> string(3) "123" ["two"]=> string(5) "itboy" }
ですので、ルーティングの書き方によっては使いづらいものになったりもするので、併せてルーティング方法も見直したほうが良いかもしれません。
[PR]
[PR]