Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 在事件侦听器中访问表单选项的干净方法_Forms_Symfony - Fatal编程技术网

Forms 在事件侦听器中访问表单选项的干净方法

Forms 在事件侦听器中访问表单选项的干净方法,forms,symfony,Forms,Symfony,如何以干净的方式从事件侦听器访问传递给buildForm()的$options?请参见下面的代码示例: class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'preS

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

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?
    }

您可以声明一个类变量,并将选项变量复制到该类变量,然后在函数中访问该类变量。

将它们选为一个而不是整个数组通常很方便:

$event->getForm()->getConfig()->getOptions()
$event->getForm()->getConfig()->getOption('option_key')
但是,如果您需要完整阵列,请遵循Artur的建议:

$event->getForm()->getConfig()->getOptions()

不要依赖于
$event->getForm()->getConfig()->getOptions()
。这不是我们要用的。我在Symfony bug跟踪器上打开了一个关于这个问题的程序,他们告诉我将变量继承到匿名函数中

注意
使用
关键字

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options) {
    // here you can use $options
}
从父作用域获取
$options
数组,并将其注入事件侦听器函数。这是一个PHP特性

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

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

$builder
    ->addEventListener(FormEvents::PRE_SET_DATA, $listener);

这对我来说应该是最好的解决方案。