2016-03-02 252 views
2

比方说,我有三大类:PHP OO登录和注册

User.php 
Password.php 
Database.php 

学习更多OOP的利益,我有一些,希望能简单回答,提问。由于我仍然不完全明白。

我想完成一些事情。从开始到底部:

  • 连接到数据库
  • 抓住基础上,发布用户名用户的密码
  • 验证散列密码张贴密码
  • 登录的用户,并将其重定向到某一页

我想使用方法:

哈希密码(当用户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是简单的setter:

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; 
} 

现在,我的主要问题。我知道我的一些方法现在可能不是最好的,但这不是我所关注的。为了OO的利益,我想知道在哪里放置哪些方法。我应该简单地把所有的数据库相关的东西放在我的Database.php?或者我应该将hashFromDatabase方法放入我的Password.php?或者它可以简单地做到两个?

我应该使用我在顶部指定的三个类吗?或者我应该简单地使用Auth类而不是UserPassword?或者这只是一个品味问题?

当然,如果你要回答,请解释为什么:)非常感谢您的任何建议!

回答

2

其实你应该使用分层应用程序。你需要的第一件事是一个模型。你有没有使用过MVC?这是一个很好的起点。

而不是把所有数据库相关的东西放在Database类里面,你会创建一个Repository类,它将负责检索给定的对象,比如用户(UsersRepository)。

存储库类将注入充当数据库驱动程序的数据库类。你会有像getUserByEmail(),getUserById()的方法。

然后你应该在其他层(控制器和视图)上工作。即使不使用框架,也会以某种分层应用程序结束。我建议你尝试一下框架,以便更好地理解这些概念。

您可能还希望创建一个服务层,并创建一个AuthService这将有与UsersRepositoryUsersController一起检查身份

+0

感谢方法,其实我已经得到了很多与Laravel经验,但我仍然很难理解把哈哈放在哪里。为了更好地理解它,我开始从头开始写一些东西,但我不想去分层应用程序,至少不是。但我想我会用我的经验来弄清楚这一点,并试图更清楚地理解它。谢谢 :) – Hardist