2009-11-12 139 views
8

我正在使用CakePHP 1.2,我只是想知道是否有任何副作用将$ this-> data传递给Controller的视图。

例:代替

// 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) {....};?> 

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

由于

回答

14

您需要了解Cake Helpers自动查找数据的不同位置,因为这是真正的区别。表格助手将根据$this->data的内容自动填写字段。这就是表单数据在验证失败时依然存在的原因。 OTOH,<select>元素选项阵列自动从复数字段名称
如果已设置,$form->select('Model.foo_id')将采用$foos的选项。

因此,$this->data有其特殊的地方,不应该轻易使用,正如命名变量有其用途,不应忽视。根据情况使用两者。如果您不想自动设置Form Helper内容,您的变量为set()。恕我直言,它也更易于分配一个变量名称,暗示其包含的数据。在$this->data上运行的所有视图都不如在$foo上运行的一个视图和$bar上的另一个视图清晰。

3

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

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

我会避免这样做,让自己保持理智。除此之外,您还可以输入更多信息。

+1

我用质朴的多德同意 - 这 - $>数据,其中$这是一个模型,控制器,视图或其他对象,我想应该是在DB从形式发布或从记录中读取数据。 我认为你的版本可读性差得多,并且违背了其他人习惯的惯例,使得它的可移植性差得多。 但是如果你真的想保存一行: $ this-> set('posts',$ this-> Post-> find('all')); – neilcrookes 2009-11-12 20:38:13

2

除了使用表单时,没有什么好的理由直接设置$ this-> data。

为什么打破约定 - 控制器:设置是有原因的。如果您想将数据传递给视图以用于显示或显示逻辑,则应该使用提供的功能,而不是试图为非预期目的共同选择Controller:数据。

如果遵循规则并按照预期的正确方式执行操作,那么CakePHP中的所有内容都会更加容易。

2

cakephp版本2 *,当您尝试设置$this->data

7

在CakePHP 2.X你应该,如果不是纯$this->data使用$this->request->data,否则你可能最终得到这个错误数据时出现错误:

Indirect modification of overloaded property View::$data has no effect

相关问题