MVC关系和DRY(MVC Relationships and DRY)

2019-11-01 03:07发布

我想创建一个用户登录系统。

我有称为AccessControl的一类器/控制器,其包括用于创建,删除和进出登录用户的所有功能。

我也有一个叫做用户模型,在它的所有数据库功能,这从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 ;
}
}

Answer 1:

一般来说,如果你想将代码重复保持在这种情况下最少我会建议你不要有每个模型处理数据库工作。

相反,你可以有一个接受和返回模型每个模型的网关。 通常对于简单检索,插入,删除,修改查询不会相差太多。 所有常见的代码可以在AbstractGateway所有其他网关的延伸。 具体的网关只处理模型具体的事情的话,像定义使用表或返回模型。

您也从中得到一些额外的好处。 您可以轻松更换数据库网关另一个存储网关。 这样,你可以甚至不需要担心数据库连接测试你的代码。

对于创建和插入用户的方法我没有看到一个问题存在。 从MVC角度来看的的createUser方法是控制器的方法和你正在执行它的动作调用模型的方法。



文章来源: MVC Relationships and DRY