2

我的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';
    }

}

服务声明:

// Example/UserBundle/Ressources/Config/services.yml
services:
    example_user.registration.form.type:
        class: Example\UserBundle\Form\Type\RegistrationFormType
        arguments: [%fos_user.model.user.class%]
        tags:
            - { name: form.type, alias: 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

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

4

3 回答 3

1

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

该解决方案对我有用:验证表格 - 我得到了两次标签

于 2013-11-04T14:39:57.003 回答
1

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

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

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
        ]);
    }
}

现在它可以工作了

于 2018-06-26T11:53:34.690 回答
0

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

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

use Doctrine\ORM\Mapping\AttributeOverrides;
use Doctrine\ORM\Mapping\AttributeOverride;

/**
 * User
 *
 * @ORM\Table(name="fos_user")
 *  @AttributeOverrides({
 *     @AttributeOverride(name="username",
 *         column=@ORM\Column(
 *             name="username",
 *             type="string",
 *             length=255,
 *             unique=false,
 *             nullable=true
 *         )
 *     ),
 *     @AttributeOverride(name="usernameCanonical",
 *         column=@ORM\Column(
 *             name="usernameCanonical",
 *             type="string",
 *             length=255,
 *             unique=false,
 *             nullable=true
 *         )
 *     )
 * })
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 */
class User extends BaseUser
{
//..

此代码将使用户名在数据库中可以为空(在运行之后php bin/console doctrine:schema:update --force)并且在验证规则中不需要。

于 2019-07-16T13:04:08.410 回答