cakephp_version:1.2.3.8166
Session.startをfalseにして明示的にセッション開始する場合は、app_controller#beforefillterでこんなことをします。
<?php function beforeFilter() { $this->Session->activate("your session cookie path"); }
で、こうするとこんな感じでCallされていきます。
- cake/libs/controller/components/session#activate()
- cake/libs/session#__construct()
- cake/libs/controller/components/session#__start()
- cake/libs/session#__initSession()
- cake/libs/session#__startSession()
最後の__startSession()でsession_start()してくれるので、セッション開始されてめでたしめでたし。ログイン後userというKeyでセッションに入れたとして、viewでこういうコードを書きます。
<?php $session->check('user');
falseになります。
最初はsession_startされていないのかと思って勉強がてら丹念にSession関係のコードを追いかけていったら、しっかりsessionには入っていました。先に$_SESSION確認しろよという・・・。なんでSessionに入っているのにfalseなのよ、と。
で、なんでfalseになるかっていうと、cake/libs/view/helpers/sessionのこの辺りのコードが原因。
<?php function __construct($base = null) { //ココ if (Configure::read('Session.start') === true) { parent::__construct($base, false); } else { $this->__active = false; } } function check($name) { if ($this->__active === true && $this->__start()) { return parent::check($name); } return false; }
core.phpでSession.startがfalseになっていると、例えControllerでsession_start()したとしてもhelperはsessionを開始していないものとみなすことになっていた。なので、何をcheckしても常にfalseが返って来てしまいました。最も手っ取り早いのはこのHelperのコンストラクタに手を入れて$this->__active = false;をやめさせればいいんですが、helperをApp:importしてtrueにするとかしたらいいのかもしれません。
あんまり役に立ちそうにないなぁこれ。
むしろこっちのほうが使える気がする
session.startがtrueの環境で明示的にセッションCookieのパスを変えたい場合は、app_controller#beforefillterで
<?php $this->Session->path = "your session cookie path";
とやると指定したパスでCookieが発行されます。