跨相关实体的Symfony2验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨相关实体的Symfony2验证相关的知识,希望对你有一定的参考价值。

我想在我的用户注册过程中使用两个Doctrine实体:UserMailaddress(我保持分开)。用户应该能够使用他们的用户名(来自表User)或他们的电子邮件地址(来自表Mailaddress)登录。

不幸的是我无法禁止@登录用户名 - 这会导致以下问题:如果用户注册了2次......:

  1. 用户名“whatever”和邮件“not@unique.com”
  2. 用户名“not@unique.com”,邮件“what@ever.com”

...我最终会有两个用户无法通过各自的用户名或电子邮件地址识别出来。所以我需要一些验证!

现在我有2个类(几乎完成)验证。

User(参考Mailaddress):

<?php

//...
use AppBundleEntityMailaddress;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;

/**
 * @ORMTable(name="user", uniqueConstraints={@ORMUniqueConstraint(name="unique_username", columns={"username"}), @ORMUniqueConstraint(name="user2mail", columns={"fk_mail"})})
 * @ORMEntity(repositoryClass="AppBundleEntityRepositoryUserRepository")
 * @UniqueEntity(
 *   fields={"username"})
 */
class User
{
    /**
     * @AssertNotBlank(...)
     * @AssertLength(...)
     * @AssertRegex(...)
     *
     * @ORMColumn(name="username", type="string", length=100, nullable=false, unique=true)
     */
    private $username;

    //...

    /**
     * @var Mailaddress
     *
     * @AssertValid()
     *
     * @ORMManyToOne(targetEntity="AppBundleEntityMailaddress", cascade={"persist"})
     * @ORMJoinColumn(name="fk_mail", referencedColumnName="id", nullable=false)
     */
    private $obj_mail;

    // ...
}

和班级Mailaddress

<?php

//...
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;

/**
 * @ORMTable(name="mailaddress", uniqueConstraints={@ORMUniqueConstraint(name="uniqueEmail", columns={"email"})})
 * @ORMEntity
 * @UniqueEntity(
 *     fields={"email"})
 */
class Mailaddress
{
    /**
     * @AssertNotBlank(...)
     * @AssertEmail(...)
     * @AssertLength(...)
     *
     * @ORMColumn(name="email", type="string", length=100, nullable=false, unique=true)
     */
    private $email;

    // ...
}

所有验证都有效,主要是检查唯一性(没有重复的用户名和电子邮件地址)。

但是我该如何验证呢

  1. 给定的电子邮件地址作为用户名还不存在?
  2. 给定的用户名不作为电子邮件地址存在?
答案

我想你想要一个自定义约束:https://symfony.com/doc/current/cookbook/validation/custom_constraint.html

当你定义它时,你将不得不进行数据库调用,所以如果更具体的话,你必须传递DoctrineManager或EntityManager(例如:在定义你的服务时参数:['@ doctrine'])

以上是关于跨相关实体的Symfony2验证的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 实体用户提供者覆盖自定义身份验证提供者

Symfony2:如何使用非默认实体管理器对用户进行身份验证?

Symfony2/Doctrine - 与普通 SQL 相关的实体抽象

Symfony2 - 验证不适用于嵌入式表单类型

Symfony2 表单验证器 - 在刷新之前比较旧值和新值

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段