2017年08月 / 07月≪ 12345678910111213141516171819202122232425262728293031≫09月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2011.01.14 (Fri)

cakephpでリダイレクトするとセッションがどうの

CakePHPで、別コントローラにリダイレクトしたらなんかセッションが取得できない。

リダイレクト前のsession_name()とリダイレクト後のsession_name()をviewで表示したけど、
リダイレクト前はcore.phpで設定されているセッション名なんだが
リダイレクト後がデフォルトのセッション名(PHPSESSID)になってる。
URLにセッションIDを付加してるんだけど、ちゃんとIDはついてる。

なんか抜けてる?設定間違えたかな?どこかで変な設定しちゃったかな?
ちなみにviewに普通にリンク貼ってリンクをクリックして移動した場合はセッションはちゃんと残ってるし、セッション名もちゃんと設定されてる。

ためしにまた別のコントローラにリダイレクトさせてみたら、こちらはちゃんとセッションが渡ってる。
違いといえば、取得できるコントローラは$componentsを設定してない。
取得できないコントローラは$componentsを設定している。

ためしに取得できないコントローラの$components=array(..部分をコメントアウトしてみたところ、
セッションが取得できるように。セッション名もちゃんと設定されている。

うーんどうしたらいいものか。
app_controllerに使用する全コンポーネント宣言しちゃって、各コントローラ内でコンポーネント宣言をしない・・・てのも微妙な気がするし。
コード追うしかないか。

ちょっと追ってみた。
ktailibrary使ってるんだけども、$ktai=array(..の設定でenable_ktai_sessionをtrueにしてたんだが
それをfalseにしたらセッションが渡った。
うーんなんか設定項目とか間違えたかなあやっぱ。
見直してみよう。

さらに追い中。
どうも$componentsを各コントローラで再設定することによってKtaiComponentのinitializeが2回よばれてるのが原因っぽいなあ。
initializeの
if($this->_options['enable_ktai_session']){
$this->_options['session_save'] = Configure::read('Session.save');
Configure::write('Session.save', 'ktai_session');
}
ここでSession.saveにktai_sessionを入れてるんだけど、initializeが2回よばれることによって
2回目のConfigure::read('Session.save');は'ktai_session'が入っちゃってる。
app_controller継承クラスの$componentsが再設定されることによってinitializeが2回呼ばれることになるのはしょうがないのかな?
自作コンポーネントのinitializeにブレークポイントおいてみたら、継承したクラスで$componentsを設定してるとやっぱり2回よばれちゃう。
継承元のinitializeと継承先initialize両方やってるってことかな?
なんにせよ2回initializeするってことは、Session.saveの元の値を何とか保持する必要があるようだ。

てことで/components/ktai.phpを下記のように修正してみた。
変更前(105行目くらい)

if($this->_options['enable_ktai_session']){
$this->_options['session_save'] = Configure::read('Session.save');
Configure::write('Session.save', 'ktai_session');
}

↓変更後

if($this->_options['enable_ktai_session']){
$tmp_name = 'Ktai.org_session';
$org = Configure::read($tmp_name);
if(!empty($org)){
$this->_options['session_save'] = $org;
}else{
$this->_options['session_save'] = Configure::read('Session.save');
Configure::write($tmp_name,$this->_options['session_save']);
}
Configure::write('Session.save', 'ktai_session');
}

とにかく一時的にかぶらないような名前でConfigure::writeで保持するようにした。
これでなんとか$componentsを宣言したコントローラにリダイレクトできるようになった。よかった。

まとめ。
app_controllerの$componentsで設定したクラスは、継承したクラスで$componentsを再設定している場合はinitializeが2回よばれることになる。

例)app_controller.phpで
class AppController extends Controller {
var $components = array('Abcd','Efg');
...

app_controllerを継承したdummy_controller.phpで
class DummyController extends AppController{
var $components = array('Hij');
...

とした構成でDummyコントローラにアクセスした場合、'Abcd'と'Efg'のinitializeが2回呼ばれ、'Hij'のinitializeが1回呼ばれる。


 |  14:02  |  PHP  |  トラックバック(0)  |  コメント(0)  |  Top↑

Comment

コメントを投稿する

URL
コメント
パス  編集・削除するのに必要
非公開  管理者だけにコメントを表示
 

Trackback

この記事のトラックバックURL

この記事へのトラックバック

 | BLOGTOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。