在我的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?
感谢您的帮助!
答案 0 :(得分:18)
将表单类型定义为服务并不意味着将从容器检索到的实例传递给createForm
。执行此操作时,只要涉及表单组件,就不会涉及容器。
要使用注册为服务的表单类型(使用form.type
标记以便表单组件知道它),您只需通过其名称引用它(即Symfony 2.8+中的完全限定类名称)以及createForm
或FormBuilder::add
中的旧版本中的类型名称。
这正是您为Symfony核心类型btw(text
,choice
等)所做的,它们被注册为服务。
当使用表单类型作为服务时,控制器的代码根本不会改变,而不是具有没有依赖关系的表单类型,并在首次使用时隐式注册。
答案 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);