‘CakePHP’ タグのついている投稿

CakePHPのRouter::normalizeにヤラれる

あるいは認証後に存在しないsコントローラーに飛ばされてエラーになる件。

1.3.6での話なのですが、例えば

http://lancard.com/hoge/

というCakePHPで構築したサイトがあってAuthで認証を行っているとします。
そこにhogesコントローラーがあったとしましょう。そのindexアクション

http://lancard.com/hoge/hoges/

で認証切れすると戻り先のUrlとしてAuth.redirectセッションに/hogesが
保持されるのですが、この状態で認証して再ログインすると

http://lancard.com/hoge/s

に飛ばされる不思議現象。 犯人はRouter::normalize。

リダイレクト処理時にRouter::normalizeで前処理されるのですがその中に

if (!empty($paths['base']) && stristr($url, $paths['base'])) {
    $url = preg_replace('/^' . preg_quote($paths['base'], '/') . '/', '', $url, 1);
}

というコードがあって、結果、Router::normalize('/hoges')は/sを返しやがります。

if (!empty($paths['base']) && stristr($url, $paths['base'] . '/')) {
    $url = preg_replace('/^' . preg_quote($paths['base'], '/') . '/', '', $url, 1);
}

と改造して$paths['base']の後ろに/がある時だけ置換するようにして対処しました。
悪影響がないことを祈りつつ。

なるべくならフレームワークに手を入れるのは避けたいところ。いい手があったら教えてください。

Facebooktwitterlinkedintumblrmail

UTF-8なCakePHP+EUC-JPなMySQL4.0

CakePHPは非常に良くできたPHPフレームワークです。
DBの種類等も設定ファイルに少し書いてやるだけで動いてくれます。

文字コードもそうで下記設定ファイルに書くだけです。
MySQLでEUC-JPを扱う場合も下記のようにするだけです。

/app/config/database.php
 'mysql',
        'persistent' => false,
        'host' => 'localhost',
        'port'=>3306,
        'database' => 'dbname',
        'login' => 'dbuser',
        'password' => 'dbpassword',
        'prefix' => '',
        'encoding' => 'ujis',
    );

}
?>

MySQLの場合はここで設定したencodingを使って、「SET NAMES ujis;」を自動的に発行してくれています。ここで問題が発生したのですが、MySQL4.0系にはSET NAMES構文がないので文字化けしてしまいます。CakePHP側もEUC-JPにしてしまえばいいのですが、今回はUTF-8である必要があり、DBとの入出力の際に、UTF-8⇔EUC-JPと変換することにしました。CakePHPはデータ操作の際に呼ばれるコールバック関数がありますので、そこで変換してやればOKです。

基本的に全ての生成されたModelはAppModelクラスを継承していますので、このクラスで変換してやります。

/app/config/app_model.php
data配列をEUC-JPに変換する処理

        return true;
    }
}
?>

もっと根っこのところで変換かけても良いのでしょうが、今回はCakePHPのライブラリには手を加えたくなかったので、こうしました。子クラスで上記関数をオーバーライドしている場合は親の関数を呼ぶのをお忘れなく。こうしたほうが良いというのがあればツッコミお待ちしてます。

Facebooktwitterlinkedintumblrmail