【发布时间】:2012-07-30 18:03:53
【问题描述】:
在我的应用程序中,我需要在应用程序工作开始时执行某种“自动登录”逻辑。在这个“自动登录”功能中,我做了很多操作,其中之一 - 使用 CookieComponent 设置 cookie。
当我在控制器或组件中使用此自动登录时 - 一切都很好,但当我从调度程序过滤器执行相同操作时,cookie 未设置。
我深入研究了 CakePHP 代码,发现当我尝试从调度程序过滤器设置 cookie 时,CakeResponse 的 $_cookies 属性为空。所以看起来调度程序过滤器创建了自己的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 组件。
【问题讨论】:
标签: cakephp cookies dispatcher cakephp-2.2