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码片的定制服务.
所以,这是我的问题:
Post Scriptum:我知道我可以使用FOSUserBundle进行用户存储和身份验证,但这是教我自己如何使用Symfony的基本示例.此外,我的服务是注入ORM.Doctrine.*以便工作(只是一个注释,谁同意混淆读这个问题)
关于业务逻辑的放置位置,主要有两种方法: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\nJava EE 6 的精益服务架构:http://www.javaworld.com/javaworld/jw-04-2009/jw-04-lean-soa-with-javaee6.html
\n\n它\xe2\x80\x99s Java,但你可以明白这个想法。
\n 归档时间: |
|
查看次数: |
4685 次 |
最近记录: |