Symfony2:如何获取构造表单的Type

时间:2014-09-15 06:57:55

标签: forms symfony

我正在尝试根据用户的权限动态生成我的表单,因为我创建了一个扩展,它将监听器添加到表单并相应地过滤它们的字段。这很好但是我在获取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());
}
....

}

4 个答案:

答案 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上测试过它,尽管它可能是相同的。