Validation 如何覆盖FOSUserBundle的验证规则

Validation 如何覆盖FOSUserBundle的验证规则,validation,symfony,symfony-forms,fosuserbundle,Validation,Symfony,Symfony Forms,Fosuserbundle,我的ExampleUserBundle扩展了FOSUserBundle。我覆盖了RegistrationFormType,如下所示: <?php // Example/UserBundle/Form/Type/RegistrationFormType.php namespace Example\UserBundle\Form\Type; use Symfony\Component\Form\FormBuilderInterface; use FOS\UserBundle\Form\Ty

我的
ExampleUserBundle
扩展了
FOSUserBundle
。我覆盖了
RegistrationFormType
,如下所示:

<?php
// Example/UserBundle/Form/Type/RegistrationFormType.php

namespace Example\UserBundle\Form\Type;

use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationFormType extends BaseType
{

    public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);
        $builder->remove('username');
    }

    public function getName() {
        return 'example_user_registration';
    }

}
在/app/config/config.yml中:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: Example\UserBundle\Entity\User
    registration:
        form:
            type: example_user_registration

使用此表单创建新的
用户
时,
FOSUserBundle
的基本验证规则不会覆盖。(电子邮件->唯一;密码->超过3个字符;…。

基本解决方案是为注册表指定不同的验证组


这个解决方案对我有效:

我也有类似的问题,但我想在我的注册表格中添加新的字段,我就是这样工作的

另外,我应该说,我在覆盖的注册表中使用了嵌入表单

class RegistrationType extends AbstractType
{
     $builder  
           ->add('avatar',FileManagerType::class,[
                "by_reference" => false,
                "data_class"=>File::class
            ])
            ->add('files', CollectionType::class,[
                "entry_type"=> UserFileManagerType::class,
                "allow_add" => true,
                "allow_delete"=>true,
                "by_reference"=>false
            ])

     public function getParent()
      {
         return 'FOS\UserBundle\Form\Type\RegistrationFormType';
      }
        public function getBlockPrefix()
      {
        return 'app_user_registration';
       }
然后在我的嵌入表单中,我喜欢这样

    class  FileManagerType extends AbstractType
    {

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('file',FileType::class,[
                    "constraints"=>[
                        new \Symfony\Component\Validator\Constraints\File([
                            "mimeTypes"=>["image/jpeg", "image/gif", "image/png", "image/jpg"],
                            "groups"=>["Registration"]
                        ])
                  ]
                ]);

        }

        public function configureOptions(OptionsResolver $resolver)
        {
            //dump($resolver);
            $resolver->setDefaults(array(
                'data_class' => File::class
            ));

        }
    }
然后在另一种形式中嵌入

class UserFileManagerType extends AbstractType
{


    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file',FileType::class,[
                "constraints"=>[
                    new \Symfony\Component\Validator\Constraints\File([
                        "mimeTypes"=>["application/pdf", "application/x-pdf"],
                        "groups"=>["Registration"]

                    ])
                ]
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => File::class
        ]);
    }
}

现在可以开始工作了

您可以通过覆盖用户属性本身来覆盖FosUserBundle的验证规则

示例:如果我不想再需要用户名,那么我必须覆盖AppBundle\Entity\User中的用户名(这扩展了FosUserBundle用户)

使用条令\ORM\Mapping\AttributeOverrides;
使用条令\ORM\Mapping\AttributeOverride;
/**
*使用者
*
*@ORM\Table(name=“fos\u user”)
*@AttributeOverrides({
*@AttributeOverride(name=“username”,
*column=@ORM\column(
*name=“username”,
*type=“string”,
*长度=255,
*唯一=错误,
*可为空=真
*         )
*     ),
*@AttributeOverride(name=“usernamecononical”,
*column=@ORM\column(
*name=“usernamecononical”,
*type=“string”,
*长度=255,
*唯一=错误,
*可为空=真
*         )
*     )
* })
*@ORM\Entity(repositoryClass=“AppBundle\Repository\UserRepository”)
*/
类用户扩展了BaseUser
{
//..
此代码将使用户名在数据库中为空(在运行
php-bin/console-doctrine:schema:update--force
之后)并且在验证规则中不是必需的

class UserFileManagerType extends AbstractType
{


    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file',FileType::class,[
                "constraints"=>[
                    new \Symfony\Component\Validator\Constraints\File([
                        "mimeTypes"=>["application/pdf", "application/x-pdf"],
                        "groups"=>["Registration"]

                    ])
                ]
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => File::class
        ]);
    }
}