cakePHPのSession.startについて

Twitter ツイート Hatena Bookmark ブックマーク

cakePHPではcore.phpにSessionに関する設定項目があります。
その中の一つである、Configure::write(‘Session.start’, true)という項目があります。
これはtrueにしておくと常にsessionをスタートされた状態になります。

Sessionをほとんど使用しないシステムではfalseにする事があります。
ただ、一部のcontorllerでのみsessionを有効にしたい場合もあると思います。

そんなときはcontrollerのbeforeFilterで以下のように記述しておくと使用できます。

1
2
3
4
5
6
7
8
<?php
class HogeController extends AppController
{
	function beforeFilter() {
		Configure::write('Session.start',true);
		$this->Session->activate();
	}
}

最初は$this->Session->start();でいいじゃないのとかおもってSessionComponent::start()実行してもSessionComponent::setFlash()とか使えませんでした。
どうやらSessionコンポーネントのなかでSessionComponent::$__activeというインスタンス変数持っているみたいで、各メソッドの実行時に$__activeがtrueじゃないと実行されないようになっています。
しかもコンストラクタが実行される段階でConfigureで指定しているSession.startがtrueになってないと__activeがfalseになります。
startメソッドじたいはSessionコンポーネントの継承もとであるCakeSessionのメソッドになるのでstartメソッド実行しても__active変数はいっさい関係ないということになります。
SessionComponent::activate()メソッド実行すると再度コンストラクタが呼ばれるのでactivateを使用します。
ただ、単純にコンストラクタを実行するだけなのでその前の段階でConfigure::write(‘Session.start’,true)とやっておかないと意味がなくなる訳です。

こんな事に2時間近く悩まされてた僕は無能だと思います(´・ω・`)

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。