使用doctrine2在控制器中创建一个持久的模型,或者使模型持久化

时间:2013-12-23 11:58:13

标签: php model-view-controller doctrine-orm

您好,我是学说新手,我不知道在以下情况下该怎么做:

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

控制器。验证模型/准备保存时。

答案 1 :(得分:0)

“模型”是一个层,而不是处理持久性的文件或类。持久性属于那里,但与您的域对象,服务,工厂以及您的应用程序需要的任何其他内容一起。

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

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

现在您可以在控制器中使用数据映射器和域对象,但对于大多数应用程序来说,更好的解决方案是服务层。它允许您在多个控制器中重用您的服务方法,并保留您的代码库DRY。如果您有多个端点来访问您的应用程序(想想普通网站,管理区域,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;
    }
}