Symfony 3 - 将表单定义为服务

2022-08-30 21:59:12

在我的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?

感谢您的任何帮助!


答案 1

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

要使用注册为服务的表单类型(带有标记以使表单组件知道它),您只需在 或 中按其名称(即 Symfony 2.8+ 中的完全限定类名和旧版本中的类型名称)引用它。这正是您对Symfony核心类型(等等)所做的,这些类型被注册为服务。当将表单类型用作服务时,控制器的代码根本不会更改,而不是具有不依赖关系并在首次使用时隐式注册的表单类型。form.typecreateFormFormBuilder::addtextchoice


答案 2

这就是我从我的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")
]); 

推荐