2016-03-02 216 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