2016-03-02 2 views
2

Допустим, у меня есть три класса:PHP OO Войти и Регистрация

User.php 
Password.php 
Database.php 

В интересах обучения больше ООП, у меня есть некоторые, надеюсь, просто ответить на вопросы. К сожалению, я до сих пор не понимаю.

Есть несколько вещей, которые я хочу выполнить. От начала до дна:

  • Подключение к базе данных
  • Grab пароль доступа пользователей на основе публикуемую пользователя
  • Проверьте хэш пароля отправленного пароль
  • Войдите пользователь в систему и перенаправить их на определенная страница

методы, которые я хочу использовать:

хэширования пароля (когда пользователь REGIST ERS):

public function hash($password) 
{ 
    return password_hash($password, PASSWORD_BCRYPT); 
} 

Схватив зашифрованный пароль из базы данных:

public function hashFromDatabase($username) 
{ 
    $stmt = $this->mysqli->db->prepare("SELECT password FROM users where username = :username"); 
    $stmt->execute(array(':username' => $username)); 

    $row = $stmt->fetch(); 

    return $row->password; 
} 

Проверка пароля (когда пользователь входит в систему):

public function verify($password, $hash) 
{ 
    if (!password_verify($password, $hash)) { 
     return false; 
    } 
    return true; 
} 

Прямо сейчас, что у меня есть, следующие, исключительно для целей тестирования, в index.php:

require 'vendor/autoload.php'; 

use App\User; 

$user = new User; 

$user->setUsername('username'); 
$user->setPassword('password'); 

echo $user->login(); 

setUsername и SetPassword простые сеттеры:

public function setPassword($password) 
{ 
    $this->password = $password; 
} 

public function setUsername($username) 
{ 
    $this->username = $username; 
} 

И $user->login(); следующий:

public function login() 
{ 
    $hash = $this->pass->hashFromDatabase($this->username); 

    $test = $this->pass->verify($this->password, $hash); 

    if($test) 
    { 
     return "YES"; 
    } 
     return "NO"; 
} 

$this->pass это из __construct:

public function __construct() 
{ 
    $database = new Database; 
    $password = new Password; 

    $this->mysqli = $database; 
    $this->pass = $password; 
} 

Теперь, мой главный вопрос. Я знаю, что некоторые из моих методов, вероятно, не самые лучшие сейчас, но это не то, что я фокусирую. Я хотел бы знать, в интересах ОО, куда поставить эти методы. Должен ли я просто поместить все данные, связанные с базой данных, в мой Database.php? Или я должен положить метод hashFromDatabase в моем Password.php? Или это может быть сделано просто так?

И должен ли я использовать три класса, которые я указал в верхней части? Или я должен просто использовать класс Auth вместо User и Password? Или это просто вопрос вкуса?

И, конечно, если вы собираетесь ответить, пожалуйста, объясните, почему :) Большое спасибо за любой совет!

ответ

2

На самом деле вы должны работать со слоистым приложением. Первое, что вам нужно, это модель. Вы когда-нибудь работали с MVC? Это хорошая начальная точка.

Вместо того чтобы помещать все связанные с базой данных базы данных в класс Database, вы должны создать класс репозитория, который будет отвечать за получение данного объекта, скажем, Пользователи (UsersRepository).

Класс репозитория должен был бы ввести класс базы данных, действующий как ваш драйвер базы данных. У вас были бы такие методы, как getUserByEmail(), getUserById().

Затем вы должны работать с другими слоями (контроллерами и представлениями). Даже если вы не используете фреймворк, вы получите какое-то многоуровневое приложение. Я предлагаю вам попробовать некоторые рамки, чтобы вы могли лучше понять эти концепции.

Вы можете создать слой служб также и создать AuthService, которые будут иметь методы для проверки идентичности вместе с UsersRepository и UsersController

+0

Спасибо, я действительно получил много опыта с Laravel, но Мне все еще трудно понять, куда положить хаха. И в интересах лучше понять это, я начал писать что-то с нуля, но я не хотел идти в сторону многоуровневого приложения, по крайней мере, на самом деле. Но я думаю, что я буду использовать свой опыт laravel, чтобы понять это и попытаться понять его более четко. Благодаря :) – Hardist

Смежные вопросы