Symfony 禁用FOSUserBundle中定义的默认约束

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

我目前正在做一个使用索纳塔的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.已使用 登记 轮廓
如何在覆盖的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类中的默认验证组
我不知道是否有更简单的方法来实现这一点。尽管如此,它对我很有效。

我会尝试一下,让你了解情况。我会尝试一下,让你了解情况。