Symfony 3-将表单定义为服务


Symfony 3 - Define form as a service

在我的Symfony 3-master项目中,我使用以下代码在控制器中创建一个窗体:

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

现在我决定用这种形式制作一个服务,这样我就可以在其中使用EntityManager

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

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

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

谢谢你的帮助!

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

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

这就是我从Symfony 2代码中在Symfony 3中注入表单作为服务所做的操作。

在我的服务中。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")
]); 

在GitHub上的第17013期中,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);

我已经测试过了,它有效!

我试图研究这个问题,并深入研究github中的更改,即:https://github.com/symfony/symfony/commit/abca2d6fdc89479586e052cd11241d5a9bc885e5#diff-5c1348d69be32426ff20446c9e812365R64

然后我找到了Symfony的公关,它删除了BC,我决定问为什么,你可以在这里看到:https://github.com/symfony/symfony/pull/16075#issuecomment-165106123

我希望这能帮助你了解它的概念!

在symfony 3.4上,您可以轻松地创建一个服务,例如,在表单中注入EntityManager:

类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);