无法从CakePHP 2.x中的控制器到期cookie

时间:2014-01-08 14:34:58

标签: php api cakephp cookies cakephp-2.0

我正在CakePHP中构建API。我有一个功能,作为其执行的一部分首先破坏与会话相关的cookie。我使用以下代码来执行此操作。

public function new_thing () {

    // I first call another controller to use functions from that controller
    App::import('Controller', 'Person');    
    $PersonsController = new PersonsController;

    // This function call is the problem
    // This does not throw any errors but does not destroy the cookie as requested
    $PersonsController->_kill_auth_cookie()

}


// This is from the Person controller, these are the functions used in the API

// This is the function that sets the cookies
public function _set_auth_cookie( $email ) {
    setcookie(Configure::read('auth_cookie_name'), $email);
}

// this is the function that does not properly destroy the cookie from the API
// interestingly, it does work when called from in this controller
public function _kill_auth_cookie() {
    setcookie(Configure::read('auth_cookie_name'), 'xxx', time()-7200);
}

我无法让API正确地使会话中先前创建的cookie失效,我不知道为什么。另外 - 令人抓狂的是日志是空的并且没有任何错误被抛出,所以我不知道下一步该做什么。

1 个答案:

答案 0 :(得分:6)

这段代码和概念存在很多错误......

  • 不要在任何地方实例化控制器。这是完全错误的,被设计破坏并违反了MVC模式。框架本身应根据请求仅调度一个控制器;你不要手动实例化它们。
  • 使用Cookie的API?好吧,并非不可能,但绝对不能与之合作。这是可能的,但我永远不会在野外看到一个。我为那个必须实施它的人感到难过。见this question
  • 你为什么不使用CookieComponent?它有一个内置的destroy()方法来删除cookie。
  • 如果您有“auth”cookie,为什么不使用CakePHP的内置Auth系统?它将处理所有这些。
  • 使用App::uses()而不是App::import()此处
  • 按照惯例,只有受保护的函数应以_
  • 为前缀

第一点很可能是因为第二个控制器实例再次启动组件而导致cookie和会话混乱的原因,并且这个cookie和会话也可能是第二次。然而,这可能导致“有趣的”副作用。

  

我首先调用另一个控制器来使用该控制器中的函数

这证明您的架构已被设计破坏。需要在其他地方执行的代码;在这种情况下应该采用模型方法。或者至少是一个组件,如果在不同的控制器之间共享与控制器相关的东西。