快速提问:我应该在哪里将具有类似特征的代码放在本实用新型服务类中,如Benjamin Eberlei在此博客文章中所述(http://www.whitewashing.de/2013/06/27/extending_symfony2__controller_utilities.html) ?
对于过渡期,我把它放在:src/ProjectName/Library中
上下文
我注意到以下内容:
我找到了一些主题相似的问题的答案,但不完全是我追求的
基于我在这里单独研究SO的问题,这个问题似乎已经被某种程度上踩死了,但我认为之前提出的问题都围绕着我实际所追求的问题.无论如何,似乎我有以下选择:
同样,问题是为了简洁:我在哪里提供在Symfony 2中提供通用的全局功能的类?
我提前谢谢了.
请提供以下创建模型层的方法的反馈,该模型层由业务规则组成,这些规则使Doctrine用于数据访问.
我目前的方法是基于这样的概念,即Model是一个ContainerAware类/对象,其中包含所有非库,业务特定的域逻辑.
我发现我必须锤击框架以这种方式做事,这就是为什么我的大脑部分质疑我的方法.
我目前正在使用Symfony 2,它像所有现代PHP MVC框架一样,使用像Doctrine 2这样的ORM层,并且不可避免地将其视为模型层.我猜这种情况与ZF2类似,所以尽管我的例子是用SF2编写的,但我认为这是一个与框架无关的问题.
具体例子
作为一个具体示例,请考虑以下情形:
消息要求
控制器
在Symfony2中,这些要求在控制器层中编码为Actions. 我将跳过检查消息是否实际属于用户的无关代码,但显然,这也应该是域逻辑的一部分.在方法"belongsToUser"或类似的.
// Vendor\MessageBundle\DefaultController
public function archiveAction(Request $request) {
// ...
$em = $this->getDoctrine()
->getManager();
$message = $em->getRepository('MessageBundle:Message');
->getManager()
->getRepository('MessageBundle:Message')
->find($request->get('id'));
$message->setIsArchived(true);
$em->persist($entity);
$em->flush();
$this->flashMessage('Message has been archived.');
// ...
}
Run Code Online (Sandbox Code Playgroud)
该模型
如果我将它放入模型中,它将如下所示:
class MessageModel
{
public function archive($messageId) {
// ...
$em = $this->getDoctrine()
->getManager();
$message = $em->getRepository('MessageBundle:Message')
->find($messageId);
$message->setIsArchived(true);
$em->persist($entity);
$em->flush();
// ... return true on success, false on fail.
}
}
Run Code Online (Sandbox Code Playgroud)
修订控制器
我的修订控制器现在看起来像这样: …