[英]Symfony 3 - Define form as a service
在我的 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 ?
感谢您的任何帮助!
将表单类型定义为服务并不意味着将从容器中检索到的实例传递给createForm
。 这样做时,只要涉及表单组件,就不会涉及容器。
要使用注册为服务的表单类型(使用form.type
标签以便表单组件知道它),您只需通过其名称(即 Symfony 2.8+ 中的完全限定类名和旧版本)在createForm
或FormBuilder::add
。 这正是您对 Symfony 核心类型 btw ( text
、 choice
等)所做的事情,它们被注册为服务。 当使用表单类型作为服务而不是使用没有依赖关系的表单类型并在第一次使用时隐式注册时,控制器的代码根本不会改变。
这就是我从我的 Symfony 2 代码在 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")
]);
在GitHub 上的 issue #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-5c1348d69be3242663R2032426c52041
然后我找到了 Symfony 的 PR,里面有这个 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.