Prefix routing毎にセッションCookieのセッション名を切り替える。CakePHP1.3

CakePHP 1.3.0から少し変わった Prefix Routing で、管理画面や携帯サイトなど、ディレクトリで分けた別サイトっぽく出来ます。
ただ、同じController/Modelクラスを使うし、config系も共有しています。
実態としては同じサイトの一部という感じです。
そこで気になるのは、セッションCookieがどうなるかと言う事です。
何かの間違いで*1PCサイトにログインしたセッションで、管理画面にログイン済み扱いになるみたいな事は避けたい。
なので、セッション名を違うものにして、混ざらないようにしたいです。

Prefix routing設定例
<?php
Configure::write('Routing.prefixes', array('admin', 'mobile', 'dev'));
APP/config/core.php
http://www.example.com/
メインのPCサイト
http://www.example.com/admin/
管理画面
http://www.example.com/mobile/
モバイルサイト
http://www.example.com/dev/
開発中のツールなど

例えばこんな形に出来たりします。

環境

Mac Mac OS X 10.5.8(Leopard
MAMP 1.7.2
CakePHP 1.3.0
php 5.2.6

サンプルコード

<?php
class AppController extends Controller {
    public function beforeFilter(){
        if(isset($this->params['prefix'])){
            switch($this->params['prefix']){
                case 'admin':
                    Configure::write('Session.cookie', 'ADMIN');
                    break;
                case 'mobile':
                    Configure::write('Session.cookie', 'MOBILE');
                    break;
                case 'dev':
                    Configure::write('Session.cookie', 'DEV');
                    break;
            }
        }
    }
}
APP/app_controller.php

Prefix routingに合致したアクセスの場合、$this->params['prefix'] にprefix名が入ってます。
なのでそれで判別です。

コンストラクタではなくbeforeFilter()

こういうのはコンストラクタに書くイメージがあるけど、これはコンストラクタではうまく行きません。
CakePHP本体の Dispatcher->dispatch() でコントローラーがnewされてます。
newの後から params がセットされるので、コンストラクタの段階ではまだ $this->params['prefix'] が空っぽです。


ちなみに Controller->beforeFilter() は、Dispatcher->dispatch() から Dispatcher->_invoke() を経て、$controller->startupProcess() の中から呼ばれます。

*1:例えばリリースしてからそれなりに経った後に、当時開発した人以外が保守開発を担当し、フラグを立て間違うとか。