在我的應用程序中,我需要在應用程序工作開始時進行某種「自動登錄」邏輯。在這個「自動登錄」功能中,我執行了許多操作,其中之一 - 使用CookieComponent設置cookie。如何在CakePHP調度程序過濾器中設置cookie?
當我在控制器或組件中使用此自動登錄時 - 一切正常,但是當我通過調度程序過濾器執行相同操作時,Cookie不會設置。
我深入研究了CakePHP代碼,發現當我嘗試從調度程序過濾器設置cookie時,$_cookies
屬性CakeResponse
爲空。所以它看起來像調度過濾器創建自己的CakeResponse
,它稍後重置,所以不設置cookie。
我的過濾器看起來是這樣的:
class UserLoadFilter extends DispatcherFilter
{
public $priority = 8;
public function beforeDispatch($event) {
App::uses('AuthComponent', 'Controller/Component');
if (!AuthComponent::user()) {
App::uses('CustomAuthComponent', 'Controller/Component');
//$controller = new AppController($event->data['request'], $event->data['response']);
$auth = new CustomAuthComponent(new ComponentCollection(), Configure::read('Auth'));
$auth->autoLogin();
}
}
}
我也試過直接在beforeDispatch方法以這種方式設置的cookie:
App::uses('CookieComponent', 'Controller/Component');
$cookie = new CookieComponent(new ComponentCollection());
$cookie->write('test', 'TEST!', false, "1 day");
但這沒有任何意義了。
我該怎麼做?也許我只是看不到一些簡單的東西,但我花了很多時間,仍然無法解決這個問題。從這個地方設置cookie是否可能?
當然,我可以嘗試使用setcookie,或寫自己的cookie包裝,但我想用CakePHP風格,使用cookie組件。
我嘗試恢復用戶數據並使用其cookie中的用戶UUID值自動登錄他(但如果用戶沒有帶UUID值的cookie,則創建新的用戶實體並將用戶UUID設置爲此用戶的cookie) 。因此,假設,如果用戶將在monthes之後回到網站,他將會登錄並重定向到他的語言環境。我想在beforeDispatcher()中執行它,因爲我想在路由啓動之前知道用戶區域設置。 關於自定義認證對象 - 我使用它,但我也需要對Auth組件進行一些更改,所以我將它擴展到我的CustomAuthComponent中。 – Vovkin 2012-07-30 07:57:21
@Vovkin在用戶被識別並登錄之後,您可以重定向到正確的語言環境。這可以避免在'beforeDispatch()'中執行此操作。 – 2012-07-30 09:18:14