【问题标题】:CakePHP reaching cookies from the view filesCakePHP 从视图文件中获取 cookie
【发布时间】:2013-11-13 11:58:10
【问题描述】:

我需要从视图文件中访问我的 cookie。我知道可以在控制器中使用 CookieComponent 并传递 cookie 值来查看带有set() 的文件。

我们网站的访问者有一个选项页面。用户的选择被保存到 cookie 中。到目前为止,我一直在使用 CookieComponent 并检查值并使用该值进行工作。但是现在我添加了新的选项选项,所以我需要从我的视图文件或我的助手中访问它们。如果我将 cookie 值从控制器传递给查看,我必须为我的每个操作都这样做,我不喜欢它。它还会编写更复杂的代码。

我看到了this questionthat question。 (也可以使用$_COOKIE[<cookie_name>] 读取它们,但该解决方案不能用于加密 cookie。我的 cookie 未加密,但将来可以)

我的问题是为什么 Cake 的库中没有 CookieHelper ?从视图文件中获取 cookie 是一种不好的做法吗?有没有一种从视图中获取 cookie 的有条不紊的方法?例如编写一个使用$_COOKIE 的自定义助手并使用该助手?

【问题讨论】:

    标签: php cakephp cookies


    【解决方案1】:

    从控制器传递数据是一种合适的方式。

    如果您需要许多/所有视图中的数据,请使用Controller::beforeFilter() 回调,这样该变量可用于特定控制器呈现的所有视图:

    class MyController extends AppController
    {
        // ...
    
        public function beforeFilter()
        {
            parent::beforeFiler();
    
            $this->set('cookie', $this->Cookie->read('cookie'));
        }
    
        // ...
    }
    

    只需确保可能的cookie component configuring读取 cookie 之前完成!

    【讨论】:

    • 虽然我同意这是正确的,但与他已经找到的答案中提供的相同。如果答案是“你不能”,那么这似乎是一个正确的答案,而不是重复 OP 已经说过他知道的内容。
    • @Dave 他发现,或者他认为他发现的是,他必须在每个控制器操作中设置值,并且出于显而易见的原因,他不喜欢这样。这个答案显示了如何通过使用beforeFilter() 回调来避免这个问题,所以至少根据他的问题,这是他不知道的。确实提到了in one of the linked questions,尽管没有进一步解释这使得该值在所有视图中都可用。随意添加一个显示解决问题的其他工作方法的答案。
    【解决方案2】:

    相信你可以通过SessionHelper访问它:

    echo $this->Session->read($cookieName);
    

    【讨论】:

    • 如果您明确将 cookie 数据写入会话中,您可以这样做,否则您将找不到任何内容。
    【解决方案3】:

    如果这不起作用,您可以借助 javascript 读取 cookie,使用 ajax 调用在文档加载时读取 cookie 并通过 json 返回来实现您的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多