考虑到我希望能够将用户保存到数据库,我的添加操作如下:
public function addAction()
{
$form = new UserForm();
$form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) {
$userFilter = new UserFilter();
$form->setInputFilter( $userFilter->getInputFilter() );
$form->setData( $request->getPost() );
if ($form->isValid())
$user = new User();
$user->setEmail($form->getInputFilter()->getValue('email') );
$user->setNome( $form->getInputFilter()->getValue('name') );
$em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
$em->persist($user);
$em->flush();
return $this->redirect()->toRoute('user');
}
}
return array('form' => $form);
}
将用户保存到数据库非常容易,但是,如果我需要添加一些复杂的业务逻辑,让我来检查电子邮件是否唯一,并且我还想访问一些Web服务来检查生活的终极问题,Universe和所有内容实际上都是42,如果为true,我想将用户保存到数据库,否则,我想向用户显示消息。
可以添加操作,但是我被告知这不是一个很好的做法,我可以将此业务逻辑放入实体User中,但这会增加zf2和该实体的学说之间的耦合,这也是不好的。在网络上搜索解决方案的答案似乎是将业务逻辑放在了服务层中。
如果不支持服务层解决方案,则可以创建类UserBusinessLogic并创建方法保存,该方法将执行业务逻辑并在一切正常的情况下保存用户。
听起来对吗?是否有关于该主题的文档?也许是一个代码示例,显示了如何使用准则2和zf2和服务来处理业务逻辑。
我猜想最重要的是:使用zf2和准则2时,将业务逻辑放在哪里的最佳实践是什么?
假设服务解决方案是最好的方法。如果我有实体用户,组以及这两个实体之间的关系,我将创建一个称为“访问”的服务,该服务将是一个从 Controller 接收数据以为用户保存组,链接这两个用户并执行其他任何任务的人发送邮件以重置用户密码。听起来对吗?
最佳答案
你有正确的主意。要进一步断开Doctrine 2的耦合,您可以在Zend\Db中的一个接口(interface)之后创建另一个层,但是使用Doctrine完成数据库交互。
同样,为了进行验证,您可以为表单创建自定义输入过滤器,从而使用Doctrine对数据库进行检查。
这个想法是,只要方法名称保持不变,就可以通过更改服务来替换服务背后的任何内容。这样,您以后就可以用Propel替换Doctrine,而不必重构 Controller 和 View ,只需重构服务类即可。
关于php - Zend Framework 2,Doctrine 2,以及适合业务逻辑的地方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16991765/