symfony 3 - 如何在表单中添加eventsubscriber作为服务

时间:2017-11-07 11:18:25

标签: forms symfony events service listener

在我的应用程序中,我在表单中为onPostSubmit事件创建了一个监听器。 我创建了一个实现EventSubscriberInterface的新类。 在builderForm中,我添加了evnet订阅者,如下所示: RewriteEngine On RewriteRule ^/?$ myfile.json [L] # return application/json for myfile.json <Files "myfile.json"> ForceType application/json </Files>

一切都运作良好,但不是我想要的......

在我的监听器中,我需要实体管理器来查询数据库。

我找到的第一个解决方案是通过选项在表单中添加实体管理器,并通过构造函数将其传递给侦听器。代码现在是: ->addEventSubscriber(new MyNewListener())

此解决方案有效,但我不想这样使用它,我更喜欢使用服务并在服务定义中添加实体管理器。

然后,我的问题是:如何将侦听器声明为服务(并传递实体管理器)以及如何在表单声明中调用它?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以将表单定义为容器中的服务,就像他在评论中提到的Cerad一样。

由于您使用的是Symfony 3,您可以选择使用autowire: true配置服务,也可以手动声明您的参数。然后在FormType中,您可以将这些类属性传递给Subscriber类。将表单定义为服务时,请务必使用form.type对其进行标记。以下是示例代码。

Services.yml

services:
    your.form.type:
        class: EventsBundle\Form\MarketerType
        autowire: true # this is not needed if using arguments
        arguments: [ '@doctrine.orm.entity_manager' ] # this is not needed if using autowire
        tags:
            - { name: form.type }

FormType.php

<?php

namespace EventsBundle\Form;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\AbstractType;
...

class FormType extends AbstractType
{
    /** @var EntityManager */
    private $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        ...
        $builder->addEventSubscriber(new YourNewListener($this->em));
    }
    ...

然后,为了安全起见,您将要清除应用程序缓存。我希望这有帮助!

答案 1 :(得分:0)

只需将您的订户视为服务即可。

Yml配置。如果您已自动连接所有课程,则可以省去autowire:true

services:
    My\Form\Type:
        autowire: true
        tags:
            - { name: form.type }

    My\Form\Listener\MyNewListener:
        autowire: true

表单类:

...

class MyForm extends AbstractType
{
    /**
     * @var MyNewListener
     */
    private $listener;

    /**
     * @param MyNewListener $listener
     */
    public function __construct(MyNewListener $listener)
    {
        $this->listener = $listener;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        ...
        $builder->addEventSubscriber($this->listener);
    }
}