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