10

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

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

我已经以各种方式尝试过这个,但新规则似乎根本没有被采纳......

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

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

我已将 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])添加验证组并添加 in 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

4

1 回答 1

10

UserAdmin 表单配置文件表单不同。


要找出表单使用的验证组,请打开 symfony 的分析器

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

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

如果您查看https://github.com/sonata-project/SonataUserBundle/blob/master/Admin/Model/UserAdmin.php 您会看到用户管理员的 validation_groups 被硬编码为注册(新)或配置文件(编辑)。

你有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;
}
于 2015-10-25T18:59:47.267 回答