Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用doctrine2使模型在控制器中持久化,或使模型自身持久化_Php_Model View Controller_Doctrine Orm - Fatal编程技术网

Php 使用doctrine2使模型在控制器中持久化,或使模型自身持久化

Php 使用doctrine2使模型在控制器中持久化,或使模型自身持久化,php,model-view-controller,doctrine-orm,Php,Model View Controller,Doctrine Orm,您好,我是一个新的信条主义者,我不知道在以下情况下该怎么办: 我有一个控制器,可以创建一个新的模型对象“Ad”。谁负责使该对象在数据库中持久化?。是因为它创建了控制器吗?还是模型本身 根据MVC,模型应该是唯一一个处理DB的人,所以我想我必须创建一个方法调用“persist”,或者创建一个名为model的接口,该接口将具有此方法,并将实体管理器注入每个模型的构造函数中,而不是使用控制器中的实体管理器使对象持久化 PD:我不想使用Zend、CI等任何框架 谢谢大家! 控制器。当您的模型被验证/准备

您好,我是一个新的信条主义者,我不知道在以下情况下该怎么办:

我有一个控制器,可以创建一个新的模型对象“Ad”。谁负责使该对象在数据库中持久化?。是因为它创建了控制器吗?还是模型本身

根据MVC,模型应该是唯一一个处理DB的人,所以我想我必须创建一个方法调用“persist”,或者创建一个名为model的接口,该接口将具有此方法,并将实体管理器注入每个模型的构造函数中,而不是使用控制器中的实体管理器使对象持久化

PD:我不想使用Zend、CI等任何框架


谢谢大家!

控制器。当您的模型被验证/准备保存时。

模型是一个层,而不是处理持久性的文件或类。持久性属于其中,但与您的域对象、服务、工厂以及您的应用程序所需的任何其他东西一起存在

控制器(和视图)是表示层的一部分,因此应仅负责与此相关的任务

如果您正在实现域对象,那么使用该模式来处理持久性通常是一个不错的选择。如果这样设置,那么对象本身根本不需要知道它们是否以及如何持久化。这使您的代码符合原则,并使其可测试

现在,您可以在控制器中使用数据映射器和域对象,但对于大多数应用程序来说,更好的解决方案是服务层。它将允许您在多个控制器中重用服务方法,并保留代码库。如果您有多个端点访问您的应用程序(想想普通的网站、管理区域、API等),这将特别有用

服务层类可以如下所示,例如:

namespace MyApp\Models;

class OrderService
{
    public function getOrders($limit=null, $offset=null)
    {
        $orders = new OrderCollection;
        $orders->setLimit($limit);
        $orders->setOffset($offset);

        $orderCollectionMapper = new OrderCollectionMapper;
        $orderCollectionMapper->populate($orders);

        return $orders;
    }
}

有什么原因吗?因为控制器创建了对象,所以它负责保存它?您的控制器只能知道它想对给定模型做什么。