你好,我是条令新手,在以下情况下我不知道该怎么办:
我有一个控制器,它创建了一个新的模型对象"广告"。谁负责使该对象在数据库中持久化?。控制器是因为它创建的?还是模型本身?
根据MVC,模型应该是唯一一个处理DB的模型,所以我想我必须创建一个名为"persistent"的方法,或者创建一个称为model的接口,该接口将具有此方法,并在每个模型的构造函数中注入实体管理器,而不是使用控制器中的实体管理器使对象持久化。
PD:我不想使用像Zend、CI等任何框架。
谢谢!
"模型"是一个层,而不是处理持久性的文件或类。持久性属于那里,但与您的域对象、服务、工厂以及应用程序所需的任何其他东西一起。
控制器(和视图)是表示层的一部分,因此应该只负责与此相关的任务。
如果您正在实现域对象,那么使用数据映射器模式来处理持久性通常是一个不错的选择。如果你这样设置,那么对象本身就不需要知道它们是否以及如何持久化。这使您的代码符合SOLID原则并可测试。
现在,您可以在控制器中使用数据映射器和域对象,但对于大多数应用程序来说,更好的解决方案是服务层。它将允许您在多个控制器中重用您的服务方法,并保持您的代码库干燥。如果你有多个端点来访问你的应用程序(想想正常的网站,管理区域,API的,等等),这是特别有帮助的
例如,服务层类可以是这样的:
namespace MyAppModels;
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;
}
}
控制器。验证/准备保存模型时。