【问题标题】:Symfony2 - customizing FormType classesSymfony2 - 自定义 FormType 类
【发布时间】:2016-10-17 16:24:46
【问题描述】:

在少数情况下我需要对我的 FormType 类进行丑陋的自定义。

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

控制器:

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

然后在 UserType 类中:

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

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

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

控制器:

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

用户类型类:

// achieved same way as previous problem

我的问题是:

  • 对于此类情况有哪些建议?
  • 我所做的是否正确且可以接受?
  • 是否有处理这些案例的文档或示例?

【问题讨论】:

    标签: php forms symfony formbuilder


    【解决方案1】:

    您可以将所有这些表单配置的逻辑移动到表单类中。

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

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

    您可以通过builForm 方法访问它:

        $user = $builder->getData();
    

    然后你就可以验证表单里面的所有条件了,就不用在控制器里弄乱了。

    【讨论】:

    • 你确定$builder->getData().据我所知,在构建过程中获取表单数据的唯一方法是使用表单事件,该事件涉及制作一个监听器,什么不是。
    • 请注意它是在 builder 上调用的,而不是在 form 上调用的。这与您心中的getData 不同。这是您作为第二个参数传递给createForm 方法或通过选项数组中的data 项(第三个参数)的初始数据。
    • 看起来不错。所以你的回答是我可以在里面自定义表单逻辑?你建议的这个版本是推荐的吗?请澄清答案,我将分配正确的答案:)
    • 是的,它使您的表单可重用并且与实体一致。另请注意,此逻辑不是业务规则,而是您构建表单的方式,因此它非常适合封装在表单类。
    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2015-02-10
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多