添加/编辑模型的代码属于哪里?模型或控制器
Posted
技术标签:
【中文标题】添加/编辑模型的代码属于哪里?模型或控制器【英文标题】:Where do code that adds/edit a model belong? Models or Controllers 【发布时间】:2010-12-24 12:17:37 【问题描述】:我正在使用带有 ORM(Doctrine 2)的 MVC 框架(Zend 框架)。乍一看,答案似乎是模型。但经过一番思考,我想知道它是否应该在控制器中。我指的是像
这样的功能static function addProduct($name, $desc, $quantity, $price)
$product = new Product();
$product->name = $name;
$product->desc = $desc;
$product->quantity = $quantity;
$product->price = $price;
$em->persist($product);
$em->flush();
这样的功能看起来还可以。但是如果我允许通过 AJAX 进行内联编辑。例如。只需编辑产品名称,我想在我的控制器中,我会使用类似
$product->setName($name);
$em->flush();
但是既然无论如何我的控制器中都需要一个实体管理器$em
,它会像我的控制器中的数据库代码一样吗?这是否意味着我做错了?或者也许我可以做类似的事情
$product = new Product();
$product->setName($name);
$product->setDesc($desc);
$product->setQuantity($quantity);
$product->setPrice($price);
$em->persist($product);
$em->flush();
在我的控制器中?
【问题讨论】:
【参考方案1】:不,我不这么认为,只是您正在使用重型控制器和轻型模型,但这会使您的代码无法重用,并且您将在同一个控制器中多次编写相同的代码
这就是我喜欢重型模型和轻型控制器的原因
【讨论】:
那么我可以说在我的控制器中,我什至不应该使用实体管理器吗?这在理论上是管理实体的东西。 我还没有使用过学说 2 + ZF,但我知道Entity Manager
在学说 2 中被大量使用
您可以考虑将$em
添加到注册表并通过$em = Zend_Regisrty::get("em");
检索
我不会将实体管理器放在注册表中:它可以由每个人随时更改,并且是职责的缺陷。此外,内部带有自己的实体管理器的重型模型听起来也不正确。我仍然会在两者之间使用一层,模型不应该打扰它的持久性!【参考方案2】:
您缺少服务层。控制器只是控制对象(模型)和运行的变量的代理。在我看来,模型类只需要是自我代表的模型,而不需要知道实体管理器。
我认为您需要在两者之间创建一个服务层。保存/修改模型时,控制器调用服务对象来执行此操作。它只是说“使用数据 $data 修改对象 $id”,服务层执行此操作。结果(成功/失败)被传回控制器以处理此结果。
【讨论】:
以上是关于添加/编辑模型的代码属于哪里?模型或控制器的主要内容,如果未能解决你的问题,请参考以下文章