向SonataUserBundle添加自定义验证规则

cap*_*ica 10 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" />
...
Run Code Online (Sandbox Code Playgroud)

在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;
}
// ...
Run Code Online (Sandbox Code Playgroud)

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

Application\Sonata\UserBundle\Entity\User:
    properties:
        foo:
            - NotNull: { groups: [CustomGroup] }
Run Code Online (Sandbox Code Playgroud)

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

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

sonata_user:
    # ...
    profile:
        form:
            validation_groups:  [CustomGroup, Profile, Default]
Run Code Online (Sandbox Code Playgroud)

(请注意,我还尝试在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()
    ;
}
Run Code Online (Sandbox Code Playgroud)

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

希望我错过了一些小事!

提前致谢,

C

Hey*_*ynn 8

该UserAdmin形式是一样的曲线形式.


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

  1. 在开发环境中发布表单(app_dev.php)
  2. 打开http://127.0.0.1:8000/app_dev.php/_profiler/
  3. 查看最近10份提交内容.
  4. 单击提交表单的POST方法(在本例中为sonata用户admin创建表单)
  5. 点击表格
  6. 在Passed Options或Resolved Options中,您应该看到validation_groups的设置.

要向SonataUserBundle的UserAdmin创建或编辑用户添加自定义验证规则,您需要执行以下操作:

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

你有2个选择.

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

Application\Sonata\UserBundle\Entity\User:
    properties:
        foo:
            - NotNull: { groups: [Registration, Profile] }
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)