Phalcon3.0.3を使い続けて数ヶ月。
大きなプロジェクトも終わりかけたそのとき!
tokyo.sample.com/
というドメインの構想でつくっていたものを要望により
www.sample.com/tokyo/
としたいとのこと。
これは、拡張性も考えて
www.sample.com/tokyo/
www.sample.com/kanagawa/
www.sample.com/saitama/
とできるように、とのことでしたので対応してみました。
config/routes.php
を変更するわけですが、
$router->add('/([a-z]*)/:controller/:action/:params', [
'pref' => 1,
'controller' => 2,
'action' => 3,
'params' => 4,
]);
と、まあPhalconのマニュアルにもあるように記述してみました。
ちなみに、以下のように書いてもいいのですが、今回は1つめが都道府県を示すため文字だけにしておきたかったので正規表現にしています。
$router->add('/{pref}/:controller/:action/:params', [
'pref' => 1,
'controller' => 2,
'action' => 3,
'params' => 4,
]);
ここでparamsは、action名以降の指定はparamsで取得され、xxxAction($param1,$param2)みたいに取得できるものかと思っていました。
それはそれでうまくいきます。
デフォルト設定を指定したときにうまくいかなくなります。
xxxAction($param1=false,$param2=false)
としたとき。
xxxActionを呼び出そうと
tokyo/controller1/xxx/
と呼び出されると、(ここ重要)
xxxAction内で期待されるのは、$param1=falseなのですが、なんと$param1="tokyo" となります。
なんと、routesで指定したprefなんですが、こいつもparamsに入ってきてました。
tokyo/controller1/xxx/param1/param2
params[0] = //param1
params[1] = //param2
params['pref'] = //
で、Actionの引数で取得しようとすると、たぶん、paramsをarray_shiftして順にセットしているようで、、。
以下の場合だと
tokyo/controller1/xxx/
params['pref'] = //
となり、
$param1 = "tokyo"
となるわけですね。
なのでroutes.phpでcontroller.action.params以外のカスタマイズパラメータを追加する場合は、Actionの引数には要注意、というよりも使わないのが一番です。