2012-09-17 60 views
0

我想創建一個用戶登錄系統。MVC關係和DRY

我有一個名爲AccessControl的類/控制器,其中包括用於創建,刪除和記錄用戶的所有功能。

我也有一個叫做Users的模型,它具有從AccessControl類調用的所有數據庫函數。

我AccessControl的類:

include_once('../models/User.php') ; 

class AccessControl { 
private $_systemKey ; 

public function __construct() 
{ 
    $this->_systemKey = 'QA>8fg)@z#t#:E60mj&MzHsm-lUj&b-}R%~<y$|nAuF)C3!r%+rT"Q<r$o?{_XR' ; 
} 

public function createUser($email, $password, $level) 
{   
    $user_salt = $this->randomString() ; 

    $password = $user_salt . $password ; 
    $password = $this->hashData($password) ; 

    if(!is_int($level)) 
    { 
     return false ; 
    } 

    //Create verification code 
    $code = $this->randomString() ; 

    //SQL... 
    $created = User->insertNewUser($email, $password, $level) ; 

    if($created != false){ 
     return true; 
    } 

    return false ; 
} 
} 

而且在我的模型:

class User extends Core { 

public function fetchSalt($username) 
{ 
    $result = $this->db->prepare("SELECT saltword FROM users WHERE username = ?") ; 
    $result->execute(array($username)) ; 
    return $result->fetchColumn() ; 
} 

public function insertNewUser($email, $password, $level) 
{ 
    //SQL Insert... 
} 

} 

我不知道如果我這樣做了正確的方式,因爲不是的createUser和insertNewUser相同?我該如何改變一下東西才能使它變幹?


核心只是我的PDO連接類,我所有的模型將從它延伸。無論如何,這是計劃。

abstract class Core { 
protected $db ; 

function __construct() 
{ 
    try{ 
     $this->db = new PDO("mysql:host=localhost;dbname=database", "user", "pass") ; 
     $this->db->exec('set names utf8') ; 
        $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
     $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 
     $this->db->setAttribute(PDO::ATTR_PERSISTENT, TRUE) ; 
    } 
    catch(PDOEXCEPTION $e) 
    { 
     echo 'Database error: <i style="color:#993300;">'.$e.'</i>' ; 
     die() ; 
    } 
} 

function __destruct() 
{ 
    $this->db = NULL ; 
} 
} 
+0

一般不會擴展一些'Core'或者God類。 – PeeHaa

+0

我認爲這應該是codereview。 – Leri

+0

@PeeHaa請告訴Magento開發者。 – feeela

回答

1

一般來說,如果你想將代碼重複保持在這種情況下最少我會建議你不要有每個模型處理數據庫工作。

相反,您可以爲每個接受和返回模型的模型設置一個網關。通常爲了簡單的檢索,插入,刪除和更新查詢不會有太大的差別。所有的通用代碼都可以在AbstractGateway中的所有其他網關擴展而來。特定的網關只處理模型特定的事情,例如定義要使用的表或要返回的模型。

您還從中獲得了一些額外的好處。您可以輕鬆地換出另一個存儲網關的數據庫網關。這樣你甚至可以測試你的代碼而不必擔心數據庫連接。

至於創建和插入用戶方法,我沒有看到一個問題。從MVC的角度來看,createUser方法是Controller的一種方法,對於您正在執行的操作,它調用了Model的方法。

+0

你知道任何專門針對網關創意的教程嗎?或者有一個簡單的例子嗎? – imperium2335

+0

這些不是很詳細:http://martinfowler.com/eaaCatalog/tableDataGateway.html,http://www.longacre-scm.com/blog/index.php/2006/02/design-pattern-table-數據網關。我自己使用它,可以給你代碼示例,但這些對於StackOverflow來說有點冗長。 – Dan