Php MVC关系与DRY
我正在尝试创建一个用户登录系统 我有一个名为AccessControl的类/控制器,它包括创建、删除和记录用户进出的所有函数 我还有一个名为Users的模型,其中包含从AccessControl类调用的所有数据库函数 我的访问控制类:Php MVC关系与DRY,php,oop,model-view-controller,Php,Oop,Model View Controller,我正在尝试创建一个用户登录系统 我有一个名为AccessControl的类/控制器,它包括创建、删除和记录用户进出的所有函数 我还有一个名为Users的模型,其中包含从AccessControl类调用的所有数据库函数 我的访问控制类: include_once('../models/User.php') ; class AccessControl { private $_systemKey ; public function __construct() { $this->_sy
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 ;
}
}
我不确定我这样做是否正确,因为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 ;
}
}
抽象类核心{
受保护$db;
函数_u构造()
{
试一试{
$this->db=newpdo(“mysql:host=localhost;dbname=database”、“user”、“pass”);
$this->db->exec('set names utf8');
$this->db->setAttribute(PDO::ATTR\u EMULATE\u PREPARES,false);
$this->db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$this->db->setAttribute(PDO::ATTR_PERSISTENT,TRUE);
}
捕获(PDO$e)
{
回显“数据库错误:”.$e.”;
模具();
}
}
函数_udestruct()
{
$this->db=NULL;
}
}
通常,如果您希望在这种情况下将代码重复保持在最低限度,我建议您不要让每个模型处理数据库工作
相反,您可以为每个接受和返回模型的模型设置一个网关。通常对于简单的检索,插入、删除和更新查询不会有太大区别。所有公共代码都可以在一个抽象网关中,其他所有网关都可以从中扩展。特定的网关只处理特定于模型的事情,比如定义要使用的表或要返回的模型
您还可以从中获得一些额外的好处。您可以轻松地将数据库网关换成另一个存储网关。这样,您甚至可以在不必担心数据库连接的情况下测试代码
至于create和insert用户方法,我看不出有什么问题。从MVC的角度来看,createUser方法是控制器的一种方法,对于您正在执行的操作,它调用模型的一种方法。一般来说,不要扩展一些
Core
或God类。我认为这应该在codereview上。@PeeHaa告诉Magento开发人员,请。p.S。如果你打算使用mysql pdo驱动程序,你真的应该这么做。@feeela不需要告诉他们我只是没有使用它:-)你知道专门针对网关思想的教程吗,或者有一个简单的例子吗?这些都不是很详细:。我自己使用它,可以给你一些代码示例,但是这些对于StackOverflow来说有点长。
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 ;
}
}