読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Session.startをfalseにするとSessionHelper->checkで常にfalseになる

cakephp_version:1.2.3.8166

Session.startをfalseにして明示的にセッション開始する場合は、app_controller#beforefillterでこんなことをします。

<?php
function beforeFilter() {
	$this->Session->activate("your session cookie path");
}

で、こうするとこんな感じでCallされていきます。

  1. cake/libs/controller/components/session#activate()
  2. cake/libs/session#__construct()
  3. cake/libs/controller/components/session#__start()
  4. cake/libs/session#__initSession()
  5. 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が発行されます。