在阅读了很多文章和Stack Overflow资源之后,我仍然遇到一些关于“将业务逻辑放在哪里?”这个著名问题的问题。阅读StackOverflow Question和A Blog Post,我相信我已经很好地理解了代码分离的问题。
假设我有一个Web表单,您可以在其中添加将添加到数据库的用户。本示例涉及以下概念:
如果我没有错过任何内容,则必须创建一个具有某些属性,getter,setter等的实体,以使其持久化到数据库中。如果要获取或编写该实体,则将使用
entityManager
,对于“非规范”查询,将使用entityRepository
(在此位置,您可以使用“查询语言”查询)。现在,您必须为所有业务逻辑定义一个服务(这是一个带有“惰性”实例的PHP类)。这是放置“大量”代码的地方。将服务记录到应用程序中后,几乎可以在任何地方使用它,这涉及代码重用等。
呈现和发布表单时,将其与您的实体(当然还有约束)绑定(bind),并使用上面定义的所有概念将它们放在一起。
因此,“old-me”将以这种方式编写 Controller 的操作:
public function indexAction(Request $request)
{
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$em = $this->getDoctrine()->getEntityManager();
$parameters = $request->request->get('User'); //form retriving
$id = $parameters['id'];
$user = $em->getRepository('SestanteUserBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$em->flush();
$modified = True;
}
$users = $this->getDoctrine()->getEntityManager()->getRepository('SestanteUserBundle:User')->findAll();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
“New-me”以这种方式重构了代码:
public function indexAction(Request $request)
{
$um = $this->get('user_manager');
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$user = $um->getUserById($request,False);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$um->flushAll();
$modified = True;
}
$users = $um->showAllUser();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
$um
是一项自定义服务,其中存储了从#1代码段到#2代码段看不到的所有代码。所以,这是我的问题:
:我知道我可以使用FOSUserBundle进行用户存储和身份验证,但这是一个自学使用Symfony的基本示例。
而且,我的服务中注入(inject)了ORM.Doctrine。*以使其正常工作(只是给那些同样困惑我读此问题的人的笔记)
最佳答案
关于将业务逻辑放在何处的主要方法有两种:SOA体系结构和域驱动的体系结构。如果您的业务对象(实体)是贫乏的,我的意思是,如果它们没有业务逻辑,只有 getter 和 setter ,那么您将更喜欢SOA。但是,如果您在业务对象中构建业务逻辑,那么您将更喜欢另一个。亚当·比恩(Adam Bien)讨论了以下方法:
Java EE 6的域驱动设计:http://www.javaworld.com/javaworld/jw-05-2009/jw-05-domain-driven-design.html
Java EE 6的精益服务体系结构:http://www.javaworld.com/javaworld/jw-04-2009/jw-04-lean-soa-with-javaee6.html
它是Java,但您可以理解。
关于model-view-controller - 在Symfony2中将业务逻辑放在哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11523072/