Symfony 4:如何覆盖Fosuserbundle验证?

时间:2018-10-08 18:15:43

标签: fosuserbundle symfony4

我使用Symfony 4,我尝试通过在config / validator /中创建一个新的validate.xml文件来覆盖Fosuserbundlevalidation.xml,但是它不起作用。它总是使用默认的validate.xml,而不是我创建的默认XML。

我想更改用户注册的验证约束。

config / packages / fos_user.yaml

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: App\Entity\User
    from_email:
        address: "test@domain.com"
        sender_name: "test@domain.com"
    registration:
        form:
            type: FOS\UserBundle\Form\Type\RegistrationFormType
            name: fos_user_registration_form
            validation_groups:  [RegistrationValidation]

config / packages / framework.yaml

framework:
    secret: '%env(APP_SECRET)%'
    csrf_protection: true
    validation: { enabled: true }
    ...

config / validator / validation.xml

<?xml version="1.0" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
    http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

<class name="FOS\UserBundle\Model\User">

    <property name="username">
        <constraint name="NotBlank">
            <option name="message">fos_user.username.blank</option>
            <option name="groups">
                <value>RegistrationValidation</value>
            </option>
        </constraint>
        <constraint name="Length">
            <option name="min">4</option>
            <option name="minMessage">fos_user.username.short</option>
            <option name="max">180</option>
            <option name="maxMessage">fos_user.username.long</option>
            <option name="groups">
                <value>RegistrationValidation</value>
            </option>
        </constraint>
    </property>
</class>

我创建了一个名为RegistrationValidation的新验证组。

如您在上面的示例中看到的,我尝试在4个角色上设置用户名的最小长度,但始终将2作为最小长度,这是默认Fosuserbundlevalidation.xml中定义的值。 / p>

有人知道该怎么做吗?关于Fosuserbundle和Symfony 4的文档不是很清楚,也不是最新的。

谢谢。

1 个答案:

答案 0 :(得分:0)

该解决方案似乎正在使用

<class name="App\Entity\User">

代替

<class name="FOS\UserBundle\Model\User">

config / validator / validation.xml 中。实际上,“ App \ Entity \ User ”是在 config / packages / fos_user.yaml 中定义的User类。

尽管如此,validation.xml似乎不适用于未应用minLength(例如)的电子邮件或plainPassword等字段。

<property name="plainPassword">
        <constraint name="NotBlank">
            <option name="message">fos_user.password.blank</option>
            <option name="groups">
                <value>RegistrationValidation</value>
            </option>
        </constraint>

        <constraint name="Length">
            <option name="min">6</option>
            <option name="minMessage">fos_user.password.short</option>
            <option name="groups">
                <value>RegistrationValidation</value>
            </option>
        </constraint>
</property>

使用Fosuserbundle的默认validation.xml甚至是正确的,它定义了呈现注册表时不会考虑的约束。我通过直接在细枝表单中设置约束来解决此问题,这些约束覆盖了fosuserbundle的约束。

希望这会有所帮助。如果您有其他解决方案,请随时发布。