在Symfony2中放置业务逻辑的位置?

Don*_*sto 24 model-view-controller symfony

在阅读了很多帖子和Stack Overflow资源后,我仍然遇到一个关于"在哪里放置业务逻辑?"的着名问题.阅读StackOverflow问题博客文章,我相信我已经很好地理解了代码分离的问题.

假设我有一个Web表单,您可以在其中添加将添加到数据库的用户.此示例涉及以下概念:

  • 形成
  • 调节器
  • 实体
  • 服务
  • 知识库

如果我没有错过任何东西,你必须创建一个包含一些属性,getter,setter等的实体,以使其持久存在于db中.如果您想获取或编写该实体,您将使用entityManager和,用于"非规范"查询entityRepository(这是您可以适合"查询语言"查询的地方).

现在,您必须为所有业务逻辑定义服务(即具有"惰性"实例的PHP类); 这是放置"重"代码的地方.将服务记录到应用程序后,几乎可以在任何地方使用它,并且涉及代码重用等.

当您渲染并发布表单时,您将它与您的实体绑定(当然还有约束)并使用上面定义的所有概念将它们放在一起.

所以,"old-me"会以这种方式编写控制器的动作:

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));
    }
Run Code Online (Sandbox Code Playgroud)

"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));
    }
Run Code Online (Sandbox Code Playgroud)

哪里$um是其中存储的所有代码,你不能从#1码片看到#2码片的定制服务.

所以,这是我的问题:

  1. 最后,我是否总体上获得了symfony2和{M} VC的精髓?
  2. 重构是好的吗?如果没有,那会是更好的方法吗?

Post Scriptum:我知道我可以使用FOSUserBundle进行用户存储和身份验证,但这是教我自己如何使用Symfony的基本示例.此外,我的服务是注入ORM.Doctrine.*以便工作(只是一个注释,谁同意混淆读这个问题)

And*_*dré 4

关于业务逻辑的放置位置,主要有两种方法:SOA 架构和领域驱动架构。如果您的业务对象(实体)贫乏,我的意思是,如果它们没有业务逻辑,只有 getter 和 setter,那么您会更喜欢 SOA。但是,如果您在业务对象内构建业务逻辑,那么您会更喜欢另一个。Adam Bien 讨论了这些方法:

\n\n

使用 Java EE 6 进行领域驱动设计:http://www.javaworld.com/javaworld/jw-05-2009/jw-05-domain-driven-design.html

\n\n

Java EE 6 的精益服务架构:http://www.javaworld.com/javaworld/jw-04-2009/jw-04-lean-soa-with-javaee6.html

\n\n

它\xe2\x80\x99s Java,但你可以明白这个想法。

\n

  • 感谢您回答我的问题。我已经读过这些文章,但它们并没有给我带来更多我想知道的东西:)如果您可以用更多细节扩展您的答案并将其与我的“真实”示例相匹配,我会很高兴(因为所有社区将)阅读、理解,甚至给你积极的反馈。 (2认同)