在阅读了很多文章和Stack Overflow资源之后,我仍然遇到一些关于“将业务逻辑放在哪里?”这个著名问题的问题。阅读StackOverflow QuestionA Blog Post,我相信我已经很好地理解了代码分离的问题。

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

  • 表格
  • Controller
  • 实体
  • 服务
  • 存储库

  • 如果我没有错过任何内容,则必须创建一个具有某些属性,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代码段看不到的所有代码。

    所以,这是我的问题:
  • 最后,我是否总体上获得了symfony2和{M} VC的精髓?
  • 重构好吗?如果没有,有什么更好的方法?

  • :我知道我可以使用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/

    10-12 13:23