考虑到我希望能够将用户保存到数据库,我的添加操作如下:

    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/

10-10 07:34