Symfony 3 - 将表单定义为服务

时间:2015-10-31 12:20:07

标签: php forms service symfony

在我的Symfony 3-master项目中,我使用此代码在控制器中创建表单:

$form = $this->createForm(ApplicantType::class, $applicant);

现在我决定从这个表单中创建一个服务,所以我可以在其中使用EntityManager。所以在Symfony2.x中,这很简单,只需在services.yml和这行代码中声明:

$form = $this->createForm($this->get("applicant.form"), $applicant);

然而,在Symfony 3中不再可能这样,因为第一个参数需要一个字符串,而不是表单本身。

所以我的问题是:如何在Symfony 3中创建表单作为服务,或者是否有其他方法如何在表单中传递EntityManager?

感谢您的帮助!

5 个答案:

答案 0 :(得分:18)

将表单类型定义为服务并不意味着将从容器检索到的实例传递给createForm。执行此操作时,只要涉及表单组件,就不会涉及容器。

要使用注册为服务的表单类型(使用form.type标记以便表单组件知道它),您只需通过其名称引用它(即Symfony 2.8+中的完全限定类名称)以及createFormFormBuilder::add中的旧版本中的类型名称。 这正是您为Symfony核心类型btw(textchoice等)所做的,它们被注册为服务。 当使用表单类型作为服务时,控制器的代码根本不会改变,而不是具有没有依赖关系的表单类型,并在首次使用时隐式注册。

答案 1 :(得分:5)

这就是我从Symfony 2 Code中将表单作为服务注入Symfony 3所做的。

在我的service.yml中我改变了

issue.form:
    class: Gutersohn\Bundle\CoreBundle\Form\IssueType
    arguments: ['@service_container']
    tags:
        - { name: form.type, alias: issue }

issue.form:
    class: Gutersohn\Bundle\CoreBundle\Form\IssueType
    arguments: ['@service_container']
    tags:
        - { name: form.type }

在我的控制器中我改变了

$form = $this->container->get('form.factory')->create($this->container->get('issue.form'), $issue, [
        "method" => "post",
        "action" => $this->container->get('router')->generate("ticket_add")
]);

$form = $this->container->get('form.factory')->create(IssueType::class, $issue, [
        "method" => "post",
        "action" => $this->container->get('router')->generate("ticket_add")
]); 

答案 2 :(得分:3)

issue #17013 on GitHub中, aliemre 声明:

  

在服务定义中添加form.type标记就足够了。

app.form.corporation_type:
    class: App\CorporationBundle\Form\CorporationType
    arguments: ["@doctrine.orm.entity_manager"]
    tags:
        - { name: form.type }
     

控制器应保持不变:

$form = $this->createForm(CorporationType::class, $corporation);

我已经测试过它的确有效!

答案 3 :(得分:1)

我试着调查问题,然后深入研究github中的变化,这就是这个: https://github.com/symfony/symfony/commit/abca2d6fdc89479586e052cd11241d5a9bc885e5#diff-5c1348d69be32426ff20446c9e812365R64

然后我发现PR进入了Symfony,这个BC被删除了,我决定问为什么原因,你可以在这里看到它: https://github.com/symfony/symfony/pull/16075#issuecomment-165106123

我希望这可以帮助你解决它周围的概念!

答案 4 :(得分:0)

在symfony 3.4上,您可以轻松创建一个服务,例如以您的形式注入EntityManager:

class addDiverseType扩展AbstractType {

private $em;

public function __construct(EntityManagerInterface $em)
{
    $this->em = $em;
}

然后,您必须在service.yml文件中将表单作为服务“转换”:

 form.add_diverse:
    class: PlatformBundle\Form\addDiverseType
    arguments: ['@doctrine.orm.entity_manager']
    tags:
        - { name: form.type }

最后,您在控制器中调用表单:

$form = $this->createForm(addDiverseType::class, $parameter);