【问题标题】:CakePHP: Passing $this->data to the View from ControllerCakePHP:将 $this->data 从控制器传递给视图
【发布时间】:2010-12-16 00:25:28
【问题描述】:

我正在使用 CakePHP 1.2,我只是想知道将 $this->data 从控制器传递到视图是否有任何副作用。

例如:

// inside PostsController, I have this code:
$this->data['Posts'] = $this->Post->find('all');

而不是:

$posts = $this->Post->find('all');
$this->set(compact('posts'));

// inside the /posts/view, I access it like this:
<?php foreach ($this->data['Posts'] as $post) {....};?> 

通过这样做,我从控制器中跳过了 $this->set() 。这是否违反了任何 MVC 模式或我可能忽略的任何安全问题?我看到使用 Auth 组件,$this->data 包含 [_Token] 数组。

谢谢

【问题讨论】:

    标签: cakephp cakephp-1.2


    【解决方案1】:

    您需要注意 Cake Helpers 自动查找数据的不同位置,因为这会产生真正的不同。表单助手将根据$this-&gt;data 的内容自动填写字段。这就是验证失败时表单数据保持不变的方式。 OTOH,&lt;select&gt; 元素选项数组自动取自复数字段名称,
    例如$form-&gt;select('Model.foo_id') 将从 $foos 中获取选项(如果已设置)。

    因此,$this-&gt;data 有其特殊的位置,不应轻易使用,正如命名变量有其用途,不应被忽视。酌情使用两者。如果您不想自动设置表单助手内容,请set() 您的变量。恕我直言,分配一个暗示它包含的数据的变量名也更具可读性。在$this-&gt;data 上运行的所有视图都比在$foo 上运行的一个视图和$bar 上运行的另一个视图要清晰。

    【讨论】:

      【解决方案2】:

      在 CakePHP 2.x 中你应该使用 $this-&gt;request-&gt;data 而不是普通的 $this-&gt;data,否则你最终可能会得到这个错误:

      重载属性View::$data的间接修改无效

      【讨论】:

        【解决方案3】:

        $controller-&gt;data 用于从视图文件发布到控件的数据。

        $view-&gt;data 用于一般数据。

        为了保持理智,我会避免这样做。除了您在视图中输入更多内容。

        【讨论】:

        • 我同意 Funky Dude - $this->data,其中 $this 是模型、控制器、视图或其他对象,我认为应该用于从表单发布或从记录中读取的数据分贝。我认为您的版本的可读性要差得多,并且违反了其他所有人都习惯的约定,从而使其可移植性大大降低。但是如果你真的想保存一行: $this->set('posts', $this->Post->find('all'));
        【解决方案4】:

        没有充分的理由直接设置 $this->data,除非使用表单。

        为什么要打破约定 - Controller:set 是有原因的。如果您想将数据传递给视图以用于显示或显示逻辑目的,则应使用提供的函数,而不是尝试将 Controller:data 用于非预期目的。

        如果您遵循规则并按照预期的正确方式做事,那么在 CakePHP 中一切都会变得更容易。

        【讨论】:

          【解决方案5】:

          cakephp 2.* 版中,尝试在$this-&gt;data 上设置数据时出现错误

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-19
            • 1970-01-01
            • 1970-01-01
            • 2012-01-27
            相关资源
            最近更新 更多