Forms 在事件侦听器中访问表单选项的干净方法
如何以干净的方式从事件侦听器访问传递给buildForm()的$options?请参见下面的代码示例: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
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);
这对我来说应该是最好的解决方案。