我根据文档安装了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
答案 0 :(得分:8)
UserAdmin表单 NOT 与个人资料表单相同。
要找出表单正在使用哪个验证组打开symfony的分析器
要向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;
}