我正在尝试创建用户登录系统。
我有一个名为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 ;
}
}
答案 0 :(得分:1)
通常,如果您希望在此方案中将代码重复保持在最低限度,我建议您不要让每个模型处理数据库工作。
相反,您可以为接受并返回模型的每个模型建立一个网关。通常,对于简单的检索,插入,删除和更新查询的差别不大。所有其他网关都可以在AbstractGateway中扩展。特定网关只处理模型特定的事情,比如定义要使用的表或返回的模型。
您还可以从中获得一些额外的好处。您可以轻松地将数据库网关换出另一个存储网关。这样,您甚至可以测试代码,而无需担心数据库连接。
至于创建和插入用户方法,我没有看到问题。从MVC的角度来看,createUser方法是Controller的一种方法,对于您正在执行的操作,它调用模型的方法。