環境はSymfony 1.4.11。

やりたいことは、次のようなルールが設定されているときに、

sample:
  url:   /:query
  param:
    module: module
    action: action

次のようなURLで引数を渡したいと言うことなのだけど、これが上手く行かない。

http://hogehoge.com/Part.3

結果は、404 Not Foundになってしまう。


なぜ404 Not Foundになってしまうかというと、渡した文字列「Part.3」に含まれるピリオドがセパレータとなって機能し(Symfony 1.4のroutingにおけるデフォルトのセパレータは「/」と「.」)、「Part」部分がモジュール名、「3」部分がアクションとして解釈されてしまうため。単純にSymfonyに文字列が渡らないと言うことであれば、次の解決策が参考になるのだけど、どうやらそういうことではないみたい。

ルートにピリオドを含める - Do You PHP はてな


解決策

…と言うようなことがわかれば解決策は比較的シンプルで、セパレータを上書きしてやればよい。

セパレータの設定上書きはアプリケーションのfactories.ymlでできる。

factories.yml

routing:
  class: sfPatternRouting
  param:
    segment_separators: ['/']

でもさすがにアプリケーション全体に設定するのは影響が大きすぎる(拡張子で動作を変えるようなroutingが動作しなくなってしまうし)ので、今回は個別のルールに対して設定を行うことで対応。

routing.yml

sample:
  url:   /:query
  param:
    module: module
    action: action
  options:
    segment_separators: ['/']

これで、セパレータが「/」のみに限定され「Part.3」全体が引数として渡されるようになります。



ていうかね、

Symfony 1.0系ではセパレータのデフォルトって「/」だけだったと思うの!!
(いやわかって使えばこっちの方が便利なんですけどね)

プロジェクトの事情で1.0系使ってるプロジェクトと1.4系使ってるプロジェクトと2系統あるのが混乱の元か。
でも1.0系をバージョンアップするのは超大変だし、かといって今さら1.0系なんか使えないし。

にょろーん。