環境は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系なんか使えないし。
にょろーん。