我目前是 CakePHP 的初学者,并且使用过 CakePHP 1.3,但最近发布了 CakePHP 2.0。
到目前为止,我喜欢它,但唯一令人痛苦的是它不返回对象,而只返回数组。我的意思是,必须执行 $post['Post']['id'] 几乎没有意义。 (在我看来)只做 $post->id 更实用。
现在在 Google 之后我偶然发现了 this链接,但是,当使用 Form 类时,这会不断产生关于未定义索引的错误(猜测这是因为它正在获取对象化版本而不是数组版本)。
我正在关注博客教程(已经在 1.3 下关注了它,但在 2.0 中再次关注它)
那么,有人知道如何在不干扰 Form 类的情况下实现这一点吗?
嘘
最佳答案
鲜为人知的事实:Cake 确实将它们作为对象或对象的良好属性返回。数组 是语法糖:
// In your View:
debug($this->viewVars);
显示 $this
是一个 View 对象 并且 viewVars
属性 对应于 $this ->set('key', $variable)
或 $this->set(compact('data', 'for', 'view'))
来自 Controller 操作。
为了击键而将它们压缩到 $Post->id
中的问题是 Cake 的原因。 Cake 被设计成举重运动员,所以它的内置 ORM 非常强大,不可避免,并且旨在处理无限关联表的无限行 - 自动回调,自动数据传递,查询生成等。多维数组的基础深度取决于在您的 find 方法中,一旦您处理多个关联模型的多个 $Post(例如),您就已经将数组引入组合中,这是不可避免的。
不同的find
方法返回不同深度的数组。从默认生成的 Controller 代码中可以看出,index 使用了 $this->set('posts', $this->paginate());
- view 使用了 $this->set ('post', $this->Post->read(null, $id));
并且编辑根本不使用 $this->set
和 Post 查找 -它分配 $this->data = $this->Post->read(null, $id);
。
FWIW,Set::map
可能会抛出那些 undefined index
错误,因为(猜测)您碰巧正在尝试映射编辑操作,amirite?默认情况下,编辑操作仅使用 $this->set
将关联的模型查找设置到 View 。 $this->read 的结果被发送到 $this->data
。这可能就是 Set::map 失败的原因。无论哪种方式,你仍然会以 $Post[0]->id
或 $Post->id
为目标(取决于你找到的方法),这并没有太大的改进。
以下是这些操作的 Set::map() 属性深度的一些通用示例:
// In posts/index.ctp
$Post = Set::map($posts);
debug($Post);
debug($Post[0]->id);
// In posts/edit/1
debug($this-viewVars);
debug($this->data);
// In posts/view/1
debug($this-viewVars);
$Post = Set::map($post);
debug($Post->id);
http://api13.cakephp.org/class/controller#method-Controllerset
http://api13.cakephp.org/class/model#method-Modelread
http://api13.cakephp.org/class/model#method-ModelsaveAll
HTH.
关于php - CakePHP 2.0 对象不是数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946480/