Я думаю, что ваша основная идея состояла в том, чтобы отделить обработку пользователя (сеанс) от запроса к базе данных , что, на мой взгляд, хорошо.
Однако это не такс вашей реальной реализацией, потому что login
экранирует данные для отправки в базу данных, даже если остальная часть метода не имеет никакого отношения к базам данных.Нельзя сказать, что ваш запрос к базе данных зависит от глобального ресурса для работы .Пока я в этом, я также предлагаю вам использовать PDO.
Кроме того, ваши свойства $_email
и $_password
находятся в частной области, но доступ к ним должен осуществляться защищенным методом.Это может вызвать проблемы. Свойства и метод должны иметь эквивалентную видимость .
Теперь я вижу, что вашему UserService
требуется три вещи : обработчик базы данных, электронная почта ипароль.Было бы разумно поместить его в конструктор .
Вот как я бы это сделал:
class UserService
{
protected $_email; // using protected so they can be accessed
protected $_password; // and overidden if necessary
protected $_db; // stores the database handler
protected $_user; // stores the user data
public function __construct(PDO $db, $email, $password)
{
$this->_db = $db;
$this->_email = $email;
$this->_password = $password;
}
public function login()
{
$user = $this->_checkCredentials();
if ($user) {
$this->_user = $user; // store it so it can be accessed later
$_SESSION['user_id'] = $user['id'];
return $user['id'];
}
return false;
}
protected function _checkCredentials()
{
$stmt = $this->_db->prepare('SELECT * FROM users WHERE email=?');
$stmt->execute(array($this->email));
if ($stmt->rowCount() > 0) {
$user = $stmt->fetch(PDO::FETCH_ASSOC);
$submitted_pass = sha1($user['salt'] . $this->_password);
if ($submitted_pass == $user['password']) {
return $user;
}
}
return false;
}
public function getUser()
{
return $this->_user;
}
}
Затем использовать его так:
$pdo = new PDO('mysql:dbname=mydb', 'myuser', 'mypass');
$userService = new UserService($pdo, $_POST['email'], $_POST['password']);
if ($user_id = $userService->login()) {
echo 'Logged it as user id: '.$user_id;
$userData = $userService->getUser();
// do stuff
} else {
echo 'Invalid login';
}