php - 使用 Symfony2/Symfony3 中的 FOSUserBundle 将用户名字段删除/替换为电子邮件

标签 php symfony fosuserbundle

我只想使用电子邮件作为登录方式,我不想拥有用户名。 symfony2/symfony3 和 FOSUserbundle 可以吗?

我在这里阅读 http://groups.google.com/group/symfony2/browse_thread/thread/92ac92eb18b423fe

但后来我遇到了两个违反约束的情况。

问题是如果用户将电子邮件地址留空,我会得到两个约束 违规:

  • 请输入用户名
  • 请输入邮箱

有没有办法禁用给定字段的验证,或者有更好的方法 完全从表单中删除一个字段?

最佳答案

需要做什么的完整概述

这里是需要做什么的完整概述。我在这篇文章的末尾列出了在这里和那里找到的不同来源。

1。覆盖 Acme\UserBundle\Entity\User

中的 setter
public function setEmail($email)
{
    $email = is_null($email) ? '' : $email;
    parent::setEmail($email);
    $this->setUsername($email);

    return $this;
}

2。从表单类型中删除用户名字段

(在 RegistrationFormTypeProfileFormType 中)

public function buildForm(FormBuilder $builder, array $options)
{
    parent::buildForm($builder, $options);
    $builder->remove('username');  // we use email as the username
    //..
}

3。验证约束

如@nurikabe 所示,我们必须摆脱FOSUserBundle 提供的验证约束并创建自己的。这意味着我们必须重新创建之前在 FOSUserBundle 中创建的所有约束,并删除与 username 字段相关的约束。我们将创建的新验证组是 AcmeRegistrationAcmeProfile。因此,我们完全覆盖了 FOSUserBundle 提供的那些。

3.a.更新 Acme\UserBundle\Resources\config\config.yml

中的配置文件
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: Acme\UserBundle\Entity\User
    registration:
        form:
            type: acme_user_registration
            validation_groups: [AcmeRegistration]
    profile:
        form:
            type: acme_user_profile
            validation_groups: [AcmeProfile]

3.b。创建验证文件 Acme\UserBundle\Resources\config\validation.yml

这是长篇:

Acme\UserBundle\Entity\User:
    properties:
    # Your custom fields in your user entity, here is an example with FirstName
        firstName:
            - NotBlank:
                message: acme_user.first_name.blank
                groups: [ "AcmeProfile" ]
            - Length:
                min: 2
                minMessage: acme_user.first_name.short
                max: 255
                maxMessage: acme_user.first_name.long
                groups: [ "AcmeProfile" ]



# Note: We still want to validate the email
# See FOSUserBundle/Resources/config/validation/orm.xml to understand
# the UniqueEntity constraint that was originally applied to both
# username and email fields
#
# As you can see, we are only applying the UniqueEntity constraint to 
# the email field and not the username field.
FOS\UserBundle\Model\User:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 
             fields: email
             errorPath: email 
             message: fos_user.email.already_used
             groups: [ "AcmeRegistration", "AcmeProfile" ]

    properties:
        email:
            - NotBlank:
                message: fos_user.email.blank
                groups: [ "AcmeRegistration", "AcmeProfile" ]
            - Length:
                min: 2
                minMessage: fos_user.email.short
                max: 255
                maxMessage: fos_user.email.long
                groups: [ "AcmeRegistration", "ResetPassword" ]
            - Email:
                message: fos_user.email.invalid
                groups: [ "AcmeRegistration", "AcmeProfile" ]
        plainPassword:
            - NotBlank:
                message: fos_user.password.blank
                groups: [ "AcmeRegistration", "ResetPassword", "ChangePassword" ]
            - Length:
                min: 2
                max: 4096
                minMessage: fos_user.password.short
                groups: [ "AcmeRegistration", "AcmeProfile", "ResetPassword", "ChangePassword"]

FOS\UserBundle\Model\Group:
    properties:
        name:
            - NotBlank:
                message: fos_user.group.blank
                groups: [ "AcmeRegistration" ]
            - Length:
                min: 2
                minMessage: fos_user.group.short
                max: 255
                maxMessage: fos_user.group.long
                groups: [ "AcmeRegistration" ]

FOS\UserBundle\Propel\User:
    properties:
        email:
            - NotBlank:
                message: fos_user.email.blank
                groups: [ "AcmeRegistration", "AcmeProfile" ]
            - Length:
                min: 2
                minMessage: fos_user.email.short
                max: 255
                maxMessage: fos_user.email.long
                groups: [ "AcmeRegistration", "ResetPassword" ]
            - Email:
                message: fos_user.email.invalid
                groups: [ "AcmeRegistration", "AcmeProfile" ]

        plainPassword:
            - NotBlank:
                message: fos_user.password.blank
                groups: [ "AcmeRegistration", "ResetPassword", "ChangePassword" ]
            - Length:
                min: 2
                max: 4096
                minMessage: fos_user.password.short
                groups: [ "AcmeRegistration", "AcmeProfile", "ResetPassword", "ChangePassword"]


FOS\UserBundle\Propel\Group:
    properties:
        name:
            - NotBlank:
                message: fos_user.group.blank
                groups: [ "AcmeRegistration" ]
            - Length:
                min: 2
                minMessage: fos_user.group.short
                max: 255
                maxMessage: fos_user.group.long
                groups: [ "AcmeRegistration" ]

4。结束

就是这样!你应该很高兴!


本文使用的文档:

关于php - 使用 Symfony2/Symfony3 中的 FOSUserBundle 将用户名字段删除/替换为电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8832916/

相关文章:

php - 我无法在 php 代码中捕获异常

运行 yuicompressor 时出现 Java 错误

php - 下拉列表选择所有不同的

Javascript 表的迭代

php - 如何在 symfony 模板中访问 c​​ss 文件中的图像

Symfony2 : Routing controllers and views in subdirectories

php - 将扩展配置文件实体添加到 FOS UserBundle

php - 如何访问 Sym2 FOSUserBundle 自定义 UserChecker 中的请求对象

php - Symfony2/FosUserBundle - 在登录前获取之前的路由

php - laravel 5.2 为 Controller 创建通用功能?必须使用助手吗?