gpt4 book ai didi

model-view-controller - Symfony2 中的业务逻辑应该放在哪里?

转载 作者:行者123 更新时间:2023-12-03 11:02:57 31 4
gpt4 key购买 nike

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

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

  • 表格
  • Controller
  • 实体
  • 服务
  • 仓库

  • 如果我没有错过什么,您必须创建一个具有一些属性、getter、setter 等的实体,以使其持久保存到数据库中。如果您想获取或写入该实体,您将使用 entityManager并且,对于“非规范”查询, entityRepository (这是您可以适合您的“查询语言”查询的地方)。

    现在您必须为所有业务逻辑定义一个服务(即一个带有“惰性”实例的 PHP 类);这是放置“重”代码的地方。一旦您将服务记录到您的应用程序中,您几乎可以在任何地方使用它,这涉及代码重用等。

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

    所以,“老我”会这样写 Controller 的 Action :
    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/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com