CakePHP在所有控制器中读取cookie

时间:2012-10-25 15:31:47

标签: cakephp cookies

今天我有一个关于cakePHP cookies的问题。 如何告诉蛋糕php记住所有应用程序控制器中的cookie?

我想做简单的协议接受。

例如,我有2个控制器。协议和Infopages。用户必须接受协议才能在我的应用上查看信息和其他内容。

这是我的协议控制器(仅限示例):

class AgreementController extends AppController {
    var $components = array('Cookie'); 

    public function acceptAgreement(){
        $this->Cookie->write('agreements', 'accepted');
    }
}

这是我的页面控制器(仅限示例):

class InfopagesController extends AppController {
public function showPage(){
    $cookie = $this->Cookie->read('agreements');
    if($cookie=="accepted"){
        /* CODE TO SHOW PAGE */
    }
    else{
        /* REDIRECT TO AGREEMENTS */
    }
}

如果cookie为空,我想将我的应用程序的所有控制器重定向到协议控制器。 我试着这样做但是cakephp只在协议控制器的行动中记住了cookie。

我的cookie组件的定义(在协议控制器中)

function beforeFilter() {
  $this->Cookie->name = 'regulamin';
  $this->Cookie->time =  3600;
}

有人能帮助我吗?

3 个答案:

答案 0 :(得分:2)

将检查添加到AppController :: beforeFilter()

   $cookie = $this->Cookie->read('agreements');
   if ($cookie != "accepted" && (get_class($this) != 'YOUR-AGREEMENTS-CONTROLLER' && $this->action != 'AGREEMENTS-ACTION')) {
        /* REDIRECT TO AGREEMENTS */
   }

如果您访问协议页面,请确保不会重定向到协议页面,如果不这样做,您将最终获得重定向循环。将条件从我的示例更改为您需要检查用户是否正在尝试访问协议页面。

还要确保在控制器beforeFilter()调用中调用parent :: beforeFilter()。如果您不知道调用父方法或如何正确使用它,请阅读有关phps OOP的内容。 http://php.net/manual/en/language.oop5.php

答案 1 :(得分:1)

使用会话。 Cakephp网站有一些关于阅读和写作的好信息。见http://book.cakephp.org/2.0/en/development/sessions.html

还将会话检查放在beforeFilter()回调中的app_controller.php中,以便在会话为空时转发所有内容。 http://book.cakephp.org/2.0/en/controllers.html

答案 2 :(得分:0)

也许在InfopagesController中无法正常工作,因为您忘记加载Cookie组件,正如您在AgreementController中正确完成的那样。

在此之后,在AppController :: beforeFilter()中检查:

1)什么是控制器;

2)如果控制器不等于“AgreementController”,则检查用户是否有cookie。

您需要检查是否不等于“AgreementController”,否则您将创建无限重定向。