モノノフ日記

普通の日記です

convertUrlStringToParameterの仕様変更

symfony 1.0.16で動作してたアプリが1.0.17だと動かなくなってたページがあったので調べてみると、原因はconvertUrlStringToParameter関数の仕様が変わってるのが原因ぽかった。(該当チケット)

convertUrlStringToParameterが定義されてるファイルは/sf_symfony_lib_dir/controller/sfWebController.class.phpです。

convertUrlStringToParameterの1.0.16と1.0.17のdiff (190行目付近)
<?php
    foreach ($matches as $match)
    {
      -  $params[$match[1][0]] = $match[2][0];
      +  $params[urldecode($match[1][0])] = urldecode($match[2][0]);
    }

sfRoutingでパラメータ展開時にurldecode処理があるかないかの違いになります。
ここでurldecodeするようになったので、「/」や「+」文字列をパラメータとして渡せなくなって上手くルーティングが出来なくなってしまったのが不具合の原因みたいです。

最初はfilterやcontrollerでなんとか出来るかなぁ、と思ってましたがよく考えたらrouting処理って、それらより先に実行されてしまうので無理でした。

解決案

少し強引ですが、「%」文字自体もURLエンコードしちゃって、デコード関数には「%」文字をデコードさせるような処理で対応しました。

処理例

「Class 2/35 ZF」という文字列だと「Class+2%252F35+ZF」という文字列に変換してます。