LoginSignup
1
1

More than 5 years have passed since last update.

Phalconでroutes.phpを使いこなす!カスタムルート設定時はAction引数は使わない。

Posted at

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
を変更するわけですが、

app/config/routes.php
$router->add('/([a-z]*)/:controller/:action/:params', [
    'pref' => 1,
    'controller' => 2,
    'action' => 3,
    'params' => 4,
]);

と、まあPhalconのマニュアルにもあるように記述してみました。
ちなみに、以下のように書いてもいいのですが、今回は1つめが都道府県を示すため文字だけにしておきたかったので正規表現にしています。

app/config/routes.php
$router->add('/{pref}/:controller/:action/:params', [
    'pref' => 1,
    'controller' => 2,
    'action' => 3,
    'params' => 4,
]);

ここでparamsは、action名以降の指定はparamsで取得され、xxxAction($param1,$param2)みたいに取得できるものかと思っていました。
それはそれでうまくいきます。

デフォルト設定を指定したときにうまくいかなくなります。

controller
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の引数には要注意、というよりも使わないのが一番です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1