在我的应用程序中,我需要在应用程序工作开始时执行某种“自动登录”逻辑。在这个“自动登录”功能中,我做了很多操作,其中之一 - 使用 CookieComponent 设置 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 组件。