Symfony 4 - UniqueEntity 约束不显示消息错误

Ale*_*xis 1 php doctrine symfony

我正在使用 symfony 4.2 和 ReactJS。我有一张带有邮件的表格。这封邮件应该是唯一的。所以我有一个 UniqueEntity 包含在 Entity 中。

问题如下,当我尝试使用表单创建帐户时,它会抛出错误 500 :"An error occurred","hydra:description":"An exception occurred while executing \u0027INSERT INTO app_users (id, username, email, is_active, firstname, lastname, api_link_key, facebook_id, facebook_picture_url) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\u0027 with params XXXXXX : Unique violation: 7 ERROR: duplicate key value violates unique constraint \u0022uniq_c2502824f85e0677\u0022\nDETAIL: Key (username)=(XXXXXX) already exists." 所以我在表单中没有消息错误,可能是因为这个错误 500 ?或者也许我应该在某处设置消息错误?

在我的实体中,当我设置邮件字段时,我也将用户名字段设置为相同的值。UniqueEntity 禁止同一行中的两个字段具有相同的值?

我的实体:

* @ORM\Table(name="app_users")
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity("email")
*/
class User implements UserInterface, \Serializable
{
   /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=254, unique=true)
     * @Encrypted
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255, unique=true)
     * @Assert\Email()
     * @Assert\NotBlank()
     * @Encrypted
     */
    private $email;

   [...]

    public function getEmail()
    {
        return $this->email;
    }

    public function setEmail($email): void
    {
        $this->email = $email;
        $this->username = $email;
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助

Ada*_*ean 5

发生这种情况是因为您已声明该字段username在基础数据库中必须是唯一的,但您没有在应用程序中验证username每个实体实例的属性确实是唯一的。-- 这就是非唯一值到达数据库层的原因。

username正如@Jakumi 所评论的,您需要为实体类的属性添加唯一的实体约束。您已经包含了该email属性,因此您只需将其扩展即可包含username在内。

改变

@UniqueEntity("email")
Run Code Online (Sandbox Code Playgroud)

@UniqueEntity("username")
@UniqueEntity("email")
Run Code Online (Sandbox Code Playgroud)

忘记提及,请确保UniqueEntity在类文件中包含约束,否则它根本不起作用:

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
Run Code Online (Sandbox Code Playgroud)

最后,您可能遇到的另一个问题是实体的用户名为空。由于该username属性不可为空,因此将假定为空字符串。数据库层在唯一检查中不考虑空值,因为空意味着“根本没有定义值”,但会检查空字符串,因为空字符串是已定义的值。我建议您还验证该username属性不能为空,@Assert\NotBlank()以避免出现此问题。