2014-01-08 61 views
-2

我正在CakePHP中構建API。我有一個函數,作爲其執行的一部分,首先破壞與會話相關的cookie。我正在使用下面的代碼來做到這一點。不能從CakePHP 2.x中的控制器中過期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,我不知道爲什麼。此外,令人生氣的是,日誌是空的,沒有任何錯誤發生,所以我不知道下一步該怎麼做。

+2

好主,這是一些可怕的代碼。 @burzum在總結原因方面做得很好。 –

回答

6

有此代碼和概念了這麼多錯...

  • 切勿實例化控制器的任何地方。這顯然是錯誤的,被設計破壞並違反了MVC模式。只有一個控制器應該由框架自己根據請求分派;你不會手動實例化它們。
  • 使用cookie的API?那麼,不是不可能的,但絕對不是很好合作。這是可能的,但我已經從來沒有看到一個在野外。我爲那些必須實施它的人感到抱歉。見this question
  • 爲什麼不使用CookieComponent?它有一個內置的destroy()方法來刪除一個cookie。
  • 如果你有一個「auth」cookie,你爲什麼不使用CakePHP的內置Auth系統?它將處理所有這些。
  • 使用App::uses()App::import()這裏
  • 按照慣例,只有保護功能時,應_

前綴第一點是非常有可能,爲什麼餅乾和會話搞砸了,因爲第二控制器實例啓動組件的原因再次,通過這個cookie和會話也許是第二次。但是,這可能會導致「有趣的」副作用。

我第一次調用另一個控制器使用的功能從控制器

這就是證據,你的架構設計打破。需要在其他地方執行的代碼;在這種情況下應該是模型方法。或者如果在不同的控制器之間共享控制器相關的東西,至少要有一個組件。

相關問題