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

我有一个称为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 ;
}
}

#1楼 票数:1 已采纳

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

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

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

至于创建和插入用户方法,我在那没看到问题。 从MVC的角度来看,createUser方法是Controller的方法,对于您要执行的操作,它称为Model的方法。

  ask by imperium2335 translate from so

未解决问题?本站智能推荐:

2回复

创建用户和编辑用户-更重要的是DRY或分离

我想知道更有经验的开发人员会如何考虑如何处理几乎相同的流程,例如用户创建配置文件和用户编辑其配置文件。 目前,我只有一个控制器方法和一个视图,通过传递$ editing标志,它可以处理新用户和现有/编辑用户之间的区别,因此我知道可以处理两者之间的任何细微差别。 在我的控制器方法和视图中都具有
3回复

带有OOP和MVC的PHP

使用PHP 5.x 问题,可以说我想显示数据库的结果。 可以说数据库中的最后30个故事。 使用OOP和MVC会是理想的设置,因为您有一个连接到db的类,一个查询数据库以获取信息的类,一个处理结果显示的类以及一个将所有内容放在一起的页面? 因此,基本上,我会将db连接对象传递给从数据库
5回复

MVC,课程在哪里?

我对MVC的理解如下(包括它可怕的错误,我以后是新的) 模型是与数据库连接的东西 视图是页面的设计/布局 控制器是一切开始的地方,本质上是页面逻辑 我正在使用CodeIgniter,但我猜测它不仅限于那个,甚至可能仅限于PHP框架。 我在哪里放置全球课程? 我可能有
2回复

MVC服务层内的限制

我最近研究了OOP和PHP MVC应用程序设计。 目前,我学到了很多东西,但目前有件事困扰着我。 我阅读并现在了解了为什么将HTTP重定向放在服务层中是不明智的。 我们不知道一旦服务完成,控制器将需要做什么,等等。我还读到,该服务不应超出其用途进行任何操作。 示例:用户注册只能使用控制
1回复

MVC是OOP概念吗?

如标题所示,我的问题是Model-View-Controller模式是否属于面向对象的编程。 我一直在使用PHP 5通过框架使用模型,视图和控制器进行编程,但是一位朋友告诉我在函数式编程中也可以使用这种模式吗? 是吗 感谢您的一贯解释。
1回复

PHPOOP和MVC良好实践

我正在使用PHP进行解析,在我脑海中一直存在这个问题很长时间,以为我可以自己解决这个问题,但是找不到很好的答案。 例如,这种情况: 我将解析表细分为模型,因此它看起来像这样: 建筑类 现在让我们说我有一个需要显示建筑物的PHP页面,但是因为我们不希望用户每次更改城市时都重新加载页
1回复

如何使用MVC交流不同的模块

我正在尝试使用以下结构来实现MVC 结构体 每个模块都有一个控制器,一个视图和一个模型。 我不知道如何在不同模块之间创建通信。 例如,如果我在Module1模型中运行一个函数,而我需要获得Module2的模型的某些东西(为了符合MVC), 我该怎么办?或者这是正确的做法? 我这
4回复

PHP和MVC,多个模型

在一个控制器动作中使用多个模型是不好的习惯? 它应该总是像一个控制器 - 一个模型 - 一个视图?