PHP中的模型验证,需要与数据库进行交互

Mik*_*key 9 php validation dao

假设我有这个模型.(为了演示目的,我非常简单.)

class User
{
    public $id;
    public $email;
    public $password;
    public $errors = [];

    public function isValid()
    {
        if (strpos($this->email, '@') === false) {
            $this->errors['email'] = 'Please enter an email address';
        }
        // ...

        return !$this->errors;
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们说我有这个DAO用于检索,添加,更新和删除用户.

class UserDAO
{
    public function getUsers() { ... }

    public function getUserById($id) { ... }

    public function addUser(User $user) { ... }

    public function updateUser(User $user) { ... }

    public function deleteUser($id) { ... }

    public function isEmailUnique($email) { ... }
}
Run Code Online (Sandbox Code Playgroud)

当我处理表单时,我通常会这样做:

$userDAO = new UserDAO();
$user = new User();
$user->email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$user->password = filter_input(INPUT_POST, 'password');

if ($user->isValid()) {
    if ($userDAO->addUser($user)) {
        // ...
    } else {
        // ...
    }
} else {
    // do something with $user->errors
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们说我的用户验证的一部分应该是检查电子邮件是否是唯一的,如何使其成为用户模型的一部分?那么,当$user->isValid()被调用时,它还会检查电子邮件是否是唯一的?或者我这样做是错的?

由于我对DAO的理解不足,DAO负责与数据库的所有交互.那么如何让模型从内部使用数据库呢?

Don*_*nic 3

我的建议是:验证模型时不要考虑电子邮件地址的唯一性User。独特性是一个UserDAO问题,而不是一个User问题。

如果它User能够自我验证,那么它应该能够孤立地这样做;其验证不应涉及任何外部交互。

电子邮件地址是否唯一重要的唯一时刻是在您尝试将其插入数据库的那一刻。考虑到多个并发用户的可能性,理论上可以验证地址的唯一性,并在您尝试插入地址时使其不再唯一。

我认为最直接、最可靠的方法是在数据库中添加对电子邮件地址的唯一约束,然后在您的addUser()方法中try添加它。如果您的数据库告诉您它不是唯一的,那么您就知道它不是唯一的。你不可能事先真正知道。