CakePHP 3实体混乱

时间:2015-02-19 10:21:35

标签: cakephp cakephp-3.0

自从我开始学习CakePHP 3以来,这是我一直面临的问题

这个实体的概念是什么,现实世界的例子会有所帮助。

public function add()
{
            // why do we have to create new entity / what is the role of entity here. 
    $comment = $this->Comments->newEntity();

    if ($this->request->is('post','put')) {

                    // why do we have to use this line after posting / what is the role of this line. 

        $comment = $this->Comments->patchEntity($comment,$this->request->data);

        if ($this->Comments->save($comment)) {
            $this->Flash->success('comment submitted successfully.');
        } else {
            $this->Flash->error('Sorry, comment could not be updated.');
        }
    }

    return $this->redirect($this->referer());
}

3 个答案:

答案 0 :(得分:6)

让我为你打开the book

  

表对象表示并提供对集合的访问   对象,实体代表您的个别行或域对象   应用。实体包含持久属性和方法   操纵和访问它们包含的数据。

-

  

为什么我们必须创建新的实体/这里的实体角色是什么。

Cake3中的几乎所有内容(如果不是全部)都与实体一起使用,上面解释了实体是什么。您需要创建一个新实体,以便FormHelper可以使用它,AFAIR如果配置为也可以使用数组,但是应该使用该实体。

实体存在的原因是抽象数据。有些人认为实体是数据库行的代表 - 这是错误的。正如书中所说,它们可以排成一列,但不必代表一行,因为3.0 ORM也可以与其他资源一起使用。理论上,您可以拥有一个CSV数据源,每行返回一个实体。

我建议你阅读CakePHP核心中的实体代码,以便更深入地了解其他实体提供的内容,只是说他们只是"只是"一组属性是简短的想法。

  

为什么我们必须在发布后使​​用这一行/这一行的作用是什么。

将帖子数据合并到之前创建的实体中。如果您有类似的基本问题,请使用API​​。 See the API entry for patchEntity()

答案 1 :(得分:1)

简单来说,Entity是一组表及其关系表的记录,您可以在不触及数据库的情况下执行操作,并根据需要封装实体(表的字段)的属性。

实体的优势。

  • 修改数据库外部的结果集(用于格式化或其他方式)
  • 需要在同一个类中表示表和行。
  • 数据验证是一场他妈的噩梦。
  • 在内部处理事物的方式以及我们返回的内容(以及如何)方面,API都不一致。
  • 您想要的其他随机内容。

  • 您可以对结果集进行运行时修改。只需向实体添加一个方法,即可以您想要的方式返回结果。这也意味着您可以使用组合来管理实体(yaya traits)

  • 验证很美。我们可以在数据进入对象之前验证数据,然后在单独的步骤中验证对象状态。
  • 开发人员更容易理解他们正在处理的内容。您要么拥有对象,要么拥有对象数组。一个对象可以链接到包含其他对象的数据,但你不再需要猜测数组键是什么,也不必猜它是否嵌套。
  • 我们可以分别迭代表和实体的接口。我们不能轻易改变旧模型类的内部因为它对两者的影响,而现在我们可以(在理论上)改变一个而不会在另一个中发生变化。
  • 看起来更漂亮简单。

答案 2 :(得分:0)

尝试一下:

if ($this->request->is('post','put')) {
 $data = $this->request->getData();
 $comment = $this->Comments->newEntity();
 $comment = $this->Comments->patchEntity($comment, $data);
 $status = $this->Comments->save($comment);
   if ($status) {
     $this->Flash->success('comment submitted successfully.');
   } else {
     $this->Flash->error('Sorry, comment could not be updated.');
   }
}

返回$ this-> redirect($ this-> referer());

}

我的建议是永远不要在同一函数中使用Post和Put。只是为了好习惯。当您使用ID(例如参数)进行更新时,放置效果很好。