在我的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
标记,以便表单组件了解它),只需在createForm
或FormBuilder::add
中按其名称(即Symfony 2.8+中的完全限定类名和旧版本中的类型名)引用即可。这正是您对Symfony核心类型btw(text
、choice
等)所做的操作,它们被注册为服务。当使用表单类型作为服务时,控制器的代码根本不会改变,而不是使用没有依赖关系的表单类型并在第一次使用时隐式注册。
这就是我从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);