【问题标题】:MVC Relationships and DRYMVC 关系和 DRY
【发布时间】:2012-09-17 12:24:16
【问题描述】:

我正在尝试创建一个用户登录系统。

我有一个名为 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 不是相同的吗?我怎样才能改变事物以使其干燥?


Core 只是我的 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 ;
}
}

【问题讨论】:

  • 一般不要扩展一些Core或God类。
  • 我认为这应该在 codereview 上。
  • @PeeHaa 请告诉 Magento 开发人员。
  • P.S.如果您要使用 mysql pdo 驱动程序,您真的应该disable emulated prepared statements
  • @feeela 不需要告诉他们我只是不使用它:-)

标签: php oop model-view-controller


【解决方案1】:

通常,如果您想在这种情况下将代码重复降至最低,我建议您不要让每个模型都处理数据库工作。

相反,您可以为每个接受和返回模型的模型设置一个网关。通常对于简单的检索,插入、删除和更新查询不会有太大差异。所有通用代码都可以位于所有其他网关扩展的 AbstractGateway 中。然后,特定网关只处理模型特定的事情,例如定义要使用的表或要返回的模型。

您还可以从中获得一些额外的好处。您可以轻松地将数据库网关换成另一个存储网关。这样您甚至可以测试您的代码,而不必担心数据库连接。

至于创建和插入用户方法,我认为那里没有问题。从 MVC 的角度来看,createUser 方法是 Controller 的方法,而对于您正在执行的操作,它会调用 Model 的方法。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多