将自定义验证规则添加到Sonata UserBundle

时间:2014-09-01 16:02:42

标签: validation symfony fosuserbundle sonata-admin sonata-user-bundle

我根据文档安装了SonataUserBundle,一切正常。除了我无法添加自定义验证规则。

我的理解是新规则应该添加到新的验证组,然后更新config.yml以告诉SonataUserBundle(或FosUserBundle)将新规则添加到验证序列。

我已经以各种方式尝试了这一点,但新规则似乎根本没有被接受......

这是我正在使用的配置......

(为了这个例子,我只是尝试将NotNull约束添加到一个新的foo字段。实际上我希望看​​到这么多工作,然后添加更多验证规则。)

我已将foo字段添加到Application\Sonata\UserBundle\Resources\config\doctrine\User.orm.xml并且一切正常,将foo字段添加到User.php类。

# in Application\Sonata\UserBundle\Resources\config\doctrine\User.orm.xml
...
<field name="foo" type="string" length="100" nullable="true" />
...

在User.php中,我们拥有带有getter和setter的属性:

// In Application\Sonata\UserBundle\Entity\User.php
// ...
/**
 * @var string
 */
private $foo;

/**
 * Set foo
 *
 * @param string $foo
 * @return User
 */
public function setFoo($foo)
{
    $this->foo = $foo;

    return $this;
}

/**
 * Get foo
 *
 * @return string 
 */
public function getFoo()
{
    return $this->foo;
}
// ...

然后我将新的验证规则添加到我项目的现有validation.yml文件中:

Application\Sonata\UserBundle\Entity\User:
    properties:
        foo:
            - NotNull: { groups: [CustomGroup] }

(请注意,我还尝试在Application \ Sonata \ UserBundle \ Resources \ config中创建validation.yml和validation.xml文件,但这似乎没有任何区别。)

在config.yml中,我告诉SonataUserBundle使用我的新CustomGroup进行验证:

sonata_user:
    # ...
    profile:
        form:
            validation_groups:  [CustomGroup, Profile, Default]

(请注意,我还尝试在fos_user级别添加验证组(fos_user.profile.form.validation_groups: [CustomGroup, Profile, Default])并添加sonata_user.profile.register.form.validation_groups: [CustomGroup, Registration, Default],但无效。)

而且,为了完整性,这里是添加到UserAdmin.php的字段:

// In Application\Sonata\UserBundle\Admin\UserAdmin.php
protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->with('General')
            // ...
            ->add('foo',        null, array('required' => false))
        ->end()
    ;
}

所以...我错过了什么? UserAdmin表单与“配置文件”表单不同吗? (虽然我也尝试更新注册表单设置)或者我在其他地方设置验证规则吗?

希望我错过了一些小事!

提前致谢,

C

1 个答案:

答案 0 :(得分:8)

UserAdmin表单 NOT 与个人资料表单相同。

要找出表单正在使用哪个验证组打开symfony的分析器

  1. 在开发环境中发布您的表单(app_dev.php)
  2. 打开http://127.0.0.1:8000/app_dev.php/_profiler/
  3. 查看最近10份提交内容。
  4. 点击提交表单的POST方法(在本例中为sonata用户admin创建表单)
  5. 点击“表格”
  6. 在“通过选项”或“已解决的选项”中,您应该看到设置了validation_groups的内容。
  7. 要向SonataUserBundle的UserAdmin创建或编辑用户添加自定义验证规则,您需要执行以下操作:

    如果你看一下https://github.com/sonata-project/SonataUserBundle/blob/master/Admin/Model/UserAdmin.php 您会看到用户admin的validation_groups被硬编码为Registration(新)或Profile(编辑)。

    你有2个选择。

    A)只需将验证规则添加到项目validation.yml并使用现有的注册验证组。

    Application\Sonata\UserBundle\Entity\User:
        properties:
            foo:
                - NotNull: { groups: [Registration, Profile] }
    

    B)覆盖UserAdmin :: getFormBulder()以添加自定义验证组

    // In Application\Sonata\UserBundle\Admin\UserAdmin.php
    public function getFormBuilder()
    {
        $this->formOptions['data_class'] = $this->getClass();
    
        $options = $this->formOptions;
        $options['validation_groups'] = (!$this->getSubject() || is_null($this->getSubject()->getId())) ? ['CustomGroup','Registration'] : 'Profile';
    
        $formBuilder = $this->getFormContractor()->getFormBuilder( $this->getUniqid(), $options);
    
        $this->defineFormBuilder($formBuilder);
    
        return $formBuilder;
    }