我正在尝试根据用户的权限动态生成我的表单,因为我创建了一个扩展,它将监听器添加到表单并相应地过滤它们的字段。这很好但是我在获取typeName时遇到问题(从每个字段(getName
)的FormTypeInterface
类的FormInterface
方法返回。我已尝试FormInterface::getName
但返回的是字段名称给予构建器例如:$builder->add('fieldName',new FooType())
当我在getName
上调用FormInterface
时,我得到“fieldName”。我想要的是FooType::getName
返回的值我怎么能这样做?我也检查了FormInterface->getConfig->getName()
但是也给了同样的结果。听众的代码:
class FooListener implements EventSubscriberInterface{
public static function getSubscribedEvents()
{
//set low priority so it's run late
return array(
FormEvents::PRE_SET_DATA => array('removeForbiddenFields', -50),
);
}
public function removeForbiddenFields(FormEvent $event){
$form = $event->getForm();
$formName = $form->getName();/*what I want for this is to return the name of the
type of the form.e.g: for the field that is construced with the code below
it must return FooType::getName*/
$fields = $form->all();
if($fields){
$this->removeForbiddenFormFields($form, $formName, $fields);
}
}
}
class barType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options){
$builder->add('fieldName',new FooType());
}
....
}
答案 0 :(得分:1)
我找到了答案。
$form->getConfig()->getType()->getName();
这将返回从FooType::getName
通过ResolvedTypeDataCollectorProxy
类返回的名称。
答案 1 :(得分:1)
来自Symfony> 2.8不推荐使用getName()并将其删除。
您现在可以使用:
$form->get('fieldName')->getConfig()->getInnerType()
获取特定的FieldName类型。
答案 2 :(得分:0)
不确定这是您要找的内容,其形式为FormName
public function __construct($permissions = null) {
$this->permissions = $permissions;
}
这就是您创建表单的方式,而在buildForm
中您可以使用if
或其他逻辑
$myForm = $this->createForm(new FormName($user->getPermissions()));
答案 3 :(得分:0)
对于使用Symfony 3的用户,现在可以使用:
$formClass = $form->getConfig()->getType()->getInnerType();
$formClass
将是类本身的stdClass表示形式(虽然不是其实例),并且您可以使用get_class($formClass)
为其类的FQCN获取字符串,例如"App\Form\Type\SillyFormType"
。
我还没有在Symfony 4上测试过它,尽管它可能是相同的。