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/
- 開発中のツールなど
例えばこんな形に出来たりします。
サンプルコード
<?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:例えばリリースしてからそれなりに経った後に、当時開発した人以外が保守開発を担当し、フラグを立て間違うとか。