8

我正在使用 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] 数组。

谢谢

4

5 回答 5

14

您需要注意 Cake Helpers 自动查找数据的不同位置,因为那才是真正的不同。表单助手将根据$this->data. 这就是验证失败时表单数据保持不变的方式。OTOH,<select>元素选项数组自动取自复数字段名称,
例如,如果设置,$form->select('Model.foo_id')则将取其选项。$foos

因此,$this->data它有其特殊的地方,不应轻易使用,就像命名变量有其用途一样,不应被忽视。酌情使用两者。如果您不想自动设置表单助手内容,set()您的变量。恕我直言,分配一个暗示它包含的数据的变量名也更具可读性。你所有的视图操作都没有一个视图操作和另一个$this->data视图操作那么清晰。$foo$bar

于 2009-11-13T01:28:03.683 回答
7

在 CakePHP 2.x中你应该$this->request->data改用 if plain $this->data,否则你最终可能会得到这个错误:

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

于 2012-06-17T20:54:59.927 回答
3

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

$view->data用于一般数据。

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

于 2009-11-12T19:29:46.907 回答
2

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

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

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

于 2009-11-13T18:17:02.743 回答
2

cakephp版本 2.* 中,当您尝试将数据设置为$this->data

于 2012-01-06T03:04:15.953 回答