【问题标题】:Symfony / MVC write thin controllersSymfony / MVC 编写瘦控制器
【发布时间】:2015-06-25 10:56:38
【问题描述】:

我有一个关于 Symfony 2 控制器构造的问题。 当我想处理一个表单时,我创建了一个单独的表单处理程序来处理表单并在我的控制器中调用这个处理程序:

public function registerAction()
{
  $formHandler = $this->container->get('fos_user.registration.form.handler');
  $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled');
  $process = $formHandler->process($confirmationEnabled);
  return new JsonResponse($process);
}

我是否也应该使用这种方法为仅包含业务逻辑且不验证表单的控制器创建 Handler 类?

例如当我将逻辑外包到单独的处理程序中时,我用于注册确认的控制器操作如下所示:

public function confirmAction($token)
{
    $formHandler = $this->container->get('acme.register_confirm.handler');
    $process = $formHandler->process($token);
    return new JsonResponse($process);
}

我会处理这个服务的 process 方法中的逻辑。

或者我应该让控制器中的逻辑而不是创建另一个单独的处理程序类吗?

如果我采用这种方法,几乎​​所有控制器看起来都一样:

1) 获取表单处理程序 2)调用handler的process方法 3) 返回响应

【问题讨论】:

    标签: php symfony model-view-controller controller


    【解决方案1】:

    第二种方法是更好的做法。业务逻辑应始终在Services 内。这为您提供了更好的separation of concerns,并使您的代码更具可重用性和可测试性。如果您调用您的服务handlerMyFancyBusinessLogicService 完全取决于您。

    【讨论】:

    • 好的,谢谢您的回答。这意味着我的控制器总是只获取请求,调用我的处理程序的 process 方法并返回响应。像“is_granted(ROLE_USER)”这样的检查也会放在处理程序/服务中吗?或者我会直接在 Controller 中进行这样的检查吗?
    • 尽量保护firewall。这样,即使在调用控制器之前,任何不安全的请求都会被捕获。如果您需要检查业务逻辑中的角色,请让您的服务依赖于安全组件(对于 Symfony >2.6 的 TokenStorage)来处理那里的安全性。
    猜你喜欢
    • 2013-12-28
    • 2013-01-20
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2015-01-20
    相关资源
    最近更新 更多