Codeigniter 4 позволяет пользователю входить в систему, используя имя пользователя или адрес электронной почты

В настоящее время у меня есть функция входа в систему, и я только установил, что пользователь может входить в систему с использованием имени пользователя. Как сделать так, чтобы пользователь входил в систему с использованием имени пользователя или электронной почты и проверял в моей базе данных, существует ли имя пользователя, когда пользователи входят в систему с их именем пользователя, и существует ли электронная почта, когда пользователи входят в систему со своей электронной почтой? Ниже мой текущий код:

Контроллер

public function login()
    {
        $data = [];
        helper(['form']);
        
        $validation =  \Config\Services::validation();
        
        if($this->request->getMethod() == 'post'){
            //validations
            $rules = [
                'username' => 'required',
                'password' => 'required|validateUser[username, password]'
            ];
            
            $errors = [
                'password' => [
                    'validateUser' => 'Username or Password don\'t match'
                ]
            ];
            
            if(!$this->validate($rules, $errors)){
                $data['validation'] = $this->validator;
            }else{
                $model = new AccountModel();
                
                $user = $model->where('username', $this->request->getVar('username'))
                              ->first();
                              
                $this->setUserSession($user);
                return redirect()->to('/account/profile');
                
            }
            
        }
        
        echo view('templates/header', $data);
        echo view('account/login');
        echo view('templates/footer');
    }

Мои правила проверки

<?php

namespace App\Validation;

use App\Models\AccountModel;

class UserRules
{
    
    public function validateUser(string $str, string $fields, array $data)
    {
        $model = new AccountModel();
        $user = $model->where('username', $data['username'])
                      ->first();
                      
        if(!$user)
            return false;
        
        return password_verify($data['password'], $user['password']);
    }
}

?>

Заранее спасибо, ребята!

2 ответа

Решение

Во-первых, имя пользователя и адрес электронной почты должны быть уникальными. Итак, когда пользователь вводит адрес электронной почты или имя пользователя, вы можете проверить, вводит ли пользователь электронную почту, используя следующий код

$email = $this->request->getPost('email');
if(substr_count($email , '@') > 0) // this is an email 
check for the email if its exists in the database
else // not an email which means it is username 
check for the username if its exists in the database

Вы можете найти эту функцию substr_count()

Изменить: вы можете использовать функцию orWhere, например,

$model->where('username' , $username)->orWhere('email',$email)->find()

так это произведет это заявление

select * from tablename where username='' or email =''

В Codeigniter 4 есть встроенная программа проверки правильности формата электронной почты и наличия электронной почты в базе данных без создания запроса к базе данных. Вы просто настраиваете модель и используете такие проверки, как

      protected $validationRules    = [
    'username'     => 'required|alpha_numeric_space|min_length[3]',
    'email'        => 'required|valid_email|is_unique[users.email]',
    'password'     => 'required|min_length[8]',
    'pass_confirm' => 'required_with[password]|matches[password]'
];

больше примеров здесь, https://codeigniter.com/user_guide/models/model.html?highlight=valid_email

Другие вопросы по тегам