创建表单作为服务的优势(而不仅仅是classType)?

时间:2015-04-23 09:35:14

标签: forms symfony service

我已经在这里和那里读过,你可以创建一个表单作为服务。但我真的没有看到这样做的重点。

有没有人能给我一个快速的例子来说明这样做的好处,而不仅仅是将表单定义为一个类。

没有代码(或者不多),但只是一个快速具体的例子,我将对表单作为一项服务,如果它是一个简单的类我不能做。

到目前为止我列出的优势(或不是):

依赖注入(实际上无需声明为服务):
   作为服务的形式将允许您将其他服务注入其中并使其成为思想构造函数。 ==>但实际上不需要将表单声明为服务来执行此操作:here使用外部服务的formType(未定义为服务)的示例。

1 个答案:

答案 0 :(得分:1)

  1. 用例1:
  2. 案例:您在多个地方使用您的表单,您的表单需要其他一些服务

    解决方案:通过将其声明为服务,您不需要每次都记住类名,并且您不必访问容器以将服务传递给表单实例,因此的:

    $this->createForm('Answer', null, array('service' => $service))
    

    你做$this->createForm('Answer', 'my_form')

    您将获得正确配置的表单。当您更改表单时,您不必在以后的代码中随处更改它。当你不必每次都将所有东西传递给构造函数时,它也更容易测试并且更难忘记。

    1. 用例2
    2. 案例:您将表单嵌入其他表单

      解决方案:您无权访问表单中的Dep.Container(而且您不应该这样做)因此无法做到

      $builder->add('Answer', new MyForm($service1,$service2))
      

      内部表单,而不是

       $builder->add('Answer', 'my_form')
      
      1. 用例3
      2. 案例:其他人使用您的代码,您的表单可能会在不同情况下发生变化

        解决方案:如果您将表单声明为服务,则可以将其类设置为参数,因此,如果其他人想要扩展您的表单,他只需使用参数即可.yml,没有弄乱你的代码。一些示例可能是像FOSUserBundle这样的捆绑包,只需使用配置就可以替换不同表单的User类。