Symfony2 - 自定义 FormType 类

Symfony2 - customizing FormType classes

我很少需要对 FormType 进行丑陋的自定义 classes。

第一个是我需要检查 userstate 是否处于活动状态,在这种情况下禁用编辑 username 的可能性。但是仅仅添加 disabled 属性并不能保护输入不被提交。所以我决定不显示用户名输入字段。我通过选项传递布尔值来实现它。

控制器:

$userForm = $this->createForm(UserType::class, $user, array(
    'is_active' => ($user->getState() == 'active')
));

然后在 UserType class:

if ($options['is_active']) {
    $builder
        ->add('username', EmailType::class);
}

$builder
    ->add('firstName', TextType::class),
...

第二种情况是我需要删除 NotBlank() 约束并在上传个人资料照片时从 FileType 字段添加 'required' => false 属性。我通过选项传递布尔值以类似的方式实现了它。

控制器:

$userForm = $this->createForm(UserType::class, $user, array(
    'is_uploaded' => !empty($photo)
));

用户类型class:

// achieved same way as previous problem

我的问题是:

您可以将所有此表单配置的逻辑移动到表单 class。

由于您将 $user 实体传递到表单中:

$userForm = $this->createForm(UserType::class, $user, array( // <- $user is passed
    'is_uploaded' => !empty($photo)
));

您可以在 builForm 方法中访问它:

    $user = $builder->getData();

然后你可以验证表单中的所有条件,而无需在控制器中弄乱。