清理在事件侦听器中访问表单选项的方法

Fox*_*ion 5 forms symfony

如何以干净的方式从事件侦听器访问传递给buildForm()的$选项?请看下面的代码示例:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'preSetDataListener']);
    }

    public function preSetDataListener(FormEvent $event)
    {
        // how would I access $options from buildFrom here?
    }
Run Code Online (Sandbox Code Playgroud)

Art*_*lin 15

$event->getForm()->getConfig()->getOptions()
Run Code Online (Sandbox Code Playgroud)


Dou*_*lva 5

不要依赖$event->getForm()->getConfig()->getOptions()。它不适合我们使用。我已经在 Symfony 错误跟踪器上针对这个问题打开了一个问题,他们告诉我将变量继承到匿名函数中。请参阅此示例

注意关键词use

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options) {
    // here you can use $options
}
Run Code Online (Sandbox Code Playgroud)

$options它从父作用域获取数组并将其注入到事件侦听器函数中。这是 PHP 的一项功能。

哦,这意味着您必须直接将匿名函数作为参数传递给addEventListener()(如上面的示例),或者将其定义buildForm()为普通变量,如下所示:

$listener = function (FormEvent $event) use ($options) {
    // do something
}

$builder
    ->addEventListener(FormEvents::PRE_SET_DATA, $listener);
Run Code Online (Sandbox Code Playgroud)