您好,我是学说新手,我不知道在以下情况下该怎么做:
我有一个控制器,可以创建一个新的模型对象“Ad”。谁负责使该对象在DB中持久化?控制器,因为它创建了它?还是模特呢?
根据MVC,该模型应该是唯一一个处理数据库的人,所以我想我必须创建一个方法调用“persist”或创建一个名为model的接口,该接口将使用此方法并注入实体管理器每个模型的构造函数,而不是使用控制器中的实体管理器使对象持久化。
PD:我不想使用Zend,CI等任何框架。谢谢!
答案 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;
}
}