Symfony 禁用FOSUserBundle中定义的默认约束
我目前正在做一个使用索纳塔的Symfony2项目 以前的开发人员直接在供应商内部进行了修改,这显然是一个巨大的错误,所以我正在重构这个。目前,我一直在修改FOSUserBundle中的约束映射 文件是:/vendor/friendsofsymfony/user bundle/FOS/UserBundle/Resources/config/validation/orm.xml 实际上,它们基于UsernameCononical字段禁用了FOS\UserBundle\Model\User类上的Uniquentity约束,如下所示: 用户名规范 用户名 fos\u user.username.已使用 登记 轮廓 -> 电子邮件规范 电子邮件 fos_user.email.已使用 登记 轮廓Symfony 禁用FOSUserBundle中定义的默认约束,symfony,fosuserbundle,symfony-sonata,sonata-user-bundle,Symfony,Fosuserbundle,Symfony Sonata,Sonata User Bundle,我目前正在做一个使用索纳塔的Symfony2项目 以前的开发人员直接在供应商内部进行了修改,这显然是一个巨大的错误,所以我正在重构这个。目前,我一直在修改FOSUserBundle中的约束映射 文件是:/vendor/friendsofsymfony/user bundle/FOS/UserBundle/Resources/config/validation/orm.xml 实际上,它们基于UsernameCononical字段禁用了FOS\UserBundle\Model\User类上的Uni
如何在覆盖的FOSUserBundle或覆盖的SonataUserBundle中复制此更改?我有一个解决方案,但不知道它是否适合您的需要。 您可以在config.yml中为fos_用户更改取消验证组名称 例如:
fos_user:
...
registration:
...
form:
validation_groups: [YourBundleNameRegistration, Default] #before it was [Registration, Default]
profile:
...
form:
...
validation_groups: [YourBundleNameProfile, Default] #before it was [Profile, Default]
然后,/vendor/friendsofsymfony/user bundle/FOS/UserBundle/Resources/config/validation/orm.xml中定义的验证约束将不再应用
您必须复制原始orm.xml,并将其粘贴到YourBundle/Resources/config目录中。在本副本中,您将使用BundleNameRegistration和BundleNameProfile替换注册和配置文件。然后删除usernamecononical上的唯一约束。我有一个解决方案,但不知道它是否适合您的需要。 您可以在config.yml中为fos_用户更改取消验证组名称 例如:
fos_user:
...
registration:
...
form:
validation_groups: [YourBundleNameRegistration, Default] #before it was [Registration, Default]
profile:
...
form:
...
validation_groups: [YourBundleNameProfile, Default] #before it was [Profile, Default]
然后,/vendor/friendsofsymfony/user bundle/FOS/UserBundle/Resources/config/validation/orm.xml中定义的验证约束将不再应用
您必须复制原始orm.xml,并将其粘贴到YourBundle/Resources/config目录中。在本副本中,您将使用BundleNameRegistration和BundleNameProfile替换注册和配置文件。然后你移除了UsernameCononical上的唯一约束。正如@Nico的答案为我指出了正确的方向,这里是我必须完成的完整设置,以便将其集成到SonataUserBundle中,并考虑到我的自定义验证组 事实上,我的自定义orm.xml文件似乎没有加载。因此,在更改验证组后,根本没有发生任何验证 1.创建一个文件orm.xml 在Application\Sonata\UserBundle\Resources\config\validation\中: 用户名规范 用户名 fos\u user.username.已使用 登记 轮廓 -> 电子邮件规范 电子邮件 fos_user.email.已使用 海关登记 自定义配置文件 2.告诉FOSUserBundle和SonataUserBundle 要使用自定义验证组,我已剥离了不相关的配置行: app/config/fos/fos_user.yml:
fos_user:
registration:
form:
validation_groups:
- CustomRegistration
profile:
form:
validation_groups:
- CustomProfile
sonata_user:
profile:
form:
validation_groups:
- CustomProfile
app/config/sonata/sonata_user.yml:
fos_user:
registration:
form:
validation_groups:
- CustomRegistration
profile:
form:
validation_groups:
- CustomProfile
sonata_user:
profile:
form:
validation_groups:
- CustomProfile
3.告诉编译器加载覆盖的验证文件
添加Application\Sonata\UserBundle\DependencyInjection\Compiler\ValidationPass.php类。这基于FOSUserBundle中的原始类:
class ValidationPass implements CompilerPassInterface
{
/**
* {@inheritDoc}
*/
public function process(ContainerBuilder $container)
{
if (!$container->hasParameter('fos_user.storage')) {
return;
}
$storage = $container->getParameter('fos_user.storage');
if ('custom' === $storage) {
return;
}
$validationFile = __DIR__ . '/../../Resources/config/validation/' . $storage . '.xml';
if ($container->hasDefinition('validator.builder')) {
// Symfony 2.5+
$container->getDefinition('validator.builder')
->addMethodCall('addXmlMapping', array($validationFile));
return;
}
}
}
class ApplicationSonataUserBundle extends Bundle
{
/**
* {@inheritdoc}
*/
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ValidationPass());
}
}
编辑应用程序\Sonata\UserBundle\applicationsonataauserbundle:
class ValidationPass implements CompilerPassInterface
{
/**
* {@inheritDoc}
*/
public function process(ContainerBuilder $container)
{
if (!$container->hasParameter('fos_user.storage')) {
return;
}
$storage = $container->getParameter('fos_user.storage');
if ('custom' === $storage) {
return;
}
$validationFile = __DIR__ . '/../../Resources/config/validation/' . $storage . '.xml';
if ($container->hasDefinition('validator.builder')) {
// Symfony 2.5+
$container->getDefinition('validator.builder')
->addMethodCall('addXmlMapping', array($validationFile));
return;
}
}
}
class ApplicationSonataUserBundle extends Bundle
{
/**
* {@inheritdoc}
*/
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ValidationPass());
}
}
4.在重载的UserAdmin类中重写Sonata的UserAdmin类中的默认验证组
我不知道是否有更简单的方法来实现这一点。尽管如此,它还是对我有用。尽管@Nico的答案为我指明了正确的方向,但为了将它集成到SonataUserBundle中,并考虑到我的自定义验证组,我必须完成以下设置 事实上,我的自定义orm.xml文件似乎没有加载。因此,在更改验证组后,根本没有发生任何验证 1.创建一个文件orm.xml 在Application\Sonata\UserBundle\Resources\config\validation\中: 用户名规范 用户名 fos\u user.username.已使用 登记 轮廓 -> 电子邮件规范 电子邮件 fos_user.email.已使用 海关登记 自定义配置文件 2.告诉FOSUserBundle和SonataUserBundle 要使用自定义验证组,我已剥离了不相关的配置行: app/config/fos/fos_user.yml:
fos_user:
registration:
form:
validation_groups:
- CustomRegistration
profile:
form:
validation_groups:
- CustomProfile
sonata_user:
profile:
form:
validation_groups:
- CustomProfile
应用程序/公司
nfig/sonata/sonata_user.yml:
fos_user:
registration:
form:
validation_groups:
- CustomRegistration
profile:
form:
validation_groups:
- CustomProfile
sonata_user:
profile:
form:
validation_groups:
- CustomProfile
3.告诉编译器加载覆盖的验证文件
添加Application\Sonata\UserBundle\DependencyInjection\Compiler\ValidationPass.php类。这基于FOSUserBundle中的原始类:
class ValidationPass implements CompilerPassInterface
{
/**
* {@inheritDoc}
*/
public function process(ContainerBuilder $container)
{
if (!$container->hasParameter('fos_user.storage')) {
return;
}
$storage = $container->getParameter('fos_user.storage');
if ('custom' === $storage) {
return;
}
$validationFile = __DIR__ . '/../../Resources/config/validation/' . $storage . '.xml';
if ($container->hasDefinition('validator.builder')) {
// Symfony 2.5+
$container->getDefinition('validator.builder')
->addMethodCall('addXmlMapping', array($validationFile));
return;
}
}
}
class ApplicationSonataUserBundle extends Bundle
{
/**
* {@inheritdoc}
*/
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ValidationPass());
}
}
编辑应用程序\Sonata\UserBundle\applicationsonataauserbundle:
class ValidationPass implements CompilerPassInterface
{
/**
* {@inheritDoc}
*/
public function process(ContainerBuilder $container)
{
if (!$container->hasParameter('fos_user.storage')) {
return;
}
$storage = $container->getParameter('fos_user.storage');
if ('custom' === $storage) {
return;
}
$validationFile = __DIR__ . '/../../Resources/config/validation/' . $storage . '.xml';
if ($container->hasDefinition('validator.builder')) {
// Symfony 2.5+
$container->getDefinition('validator.builder')
->addMethodCall('addXmlMapping', array($validationFile));
return;
}
}
}
class ApplicationSonataUserBundle extends Bundle
{
/**
* {@inheritdoc}
*/
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ValidationPass());
}
}
4.在重载的UserAdmin类中重写Sonata的UserAdmin类中的默认验证组
我不知道是否有更简单的方法来实现这一点。尽管如此,它对我很有效。我会尝试一下,让你了解情况。我会尝试一下,让你了解情况。