加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – MVC,模型和数据访问对象

发布时间:2021-08-28 03:47:45 所属栏目:大数据 来源: https://www.jb51.cc
导读:我有一个理论问题,我希望有人能帮助我弄明白. 我目前正在使用MVC设计模式在PHP中编写一个简单的Web应用程序.我已经看过并阅读了一些关于这个主题的教程,但它们通常要么过于复杂,要么过于简单. 所以我目前所拥有的是一个简单的用户模型: class User { privat

我有一个理论问题,我希望有人能帮助我弄明白.

我目前正在使用MVC设计模式在PHP中编写一个简单的Web应用程序.我已经看过并阅读了一些关于这个主题的教程,但它们通常要么过于复杂,要么过于简单.

所以我目前所拥有的是一个简单的用户模型:

class User {

    private $username;
    private $group; //user, admin, etc

    // getters
}

我还有一个简单的Database类来实现这个类:

interface DatabaseInterface {

    public function connect();
    public function disconnect();
    public function prepare($sql = null);
    public function execute($params = array());
    public function rowCount();
    public function fetch();
}

我的问题是我应该如何通过填充我的User类链接这个Database类?

我目前所拥有的是另一个名为UserDAO的类,它在它的构造函数中传递了Database类的引用,它有一个名为ValidateUser()的函数,然后使用上面的接口方法来检查用户对数据库.

class UserDAO {

    private $database;

    public function __construct($database) {

        $this->database = $database;
    }

    public function validateUser($username, $password) {

        $this->database->prepare('SELECT * FROM users WHERE...');
        ....
        return true/false;
    }
}

现在我通过构造函数将UserDAO对象传递给User类,并在User类中添加另一个ValidateUser()方法,它基本上只调用UserDAO类中的ValidateUser()方法.

新的User类:

class User {

    private $username;
    private $group; //user, admin, etc
    private $userDAO;

    public function __construct($userDAO) {

        $this->userDAO = $userDAO;
    }

    public function validateUser($username, $password) {

        if($this->userDAO->validateUser($username, $password)) {

            // set stuff that i need
            return true;
        }

        return false;
    }

    // getters
}

关于这一点对我来说感觉不对.有人能帮我理解这个过程通常流动的方式吗?

此外,Database类通常保持静态,所以我可以使用Database :: instance()之类的东西调用连接吗?现在我正在PHP页面的开头创建一个数据库对象并传递它.

如果有什么不清楚的话,请随时给我发表评论,我会尽快修复它.

感谢您对帖子的长度感到满意.

解决方法:

这取决于您的解决方案应该是最新的.

独生子

“最旧的”版本是在任何地方都有一个静态连接.你通过使用单例来实现这一点:

class database {

    private $instance = NULL;

    private function __construct()

    public function getDb() {
        return $this->instance?: $this->instance = new database();
    }

}

注册处

第二个更新的解决方案是使用注册表:
您可以拥有一个由所有其他类扩展的基类,并为像这样的调用提供方法

$this->getRegistry()->getDb

通常,注册表在脚本的开头填充,例如在引导程序中.
优点是您可以更好地对组件进行单元测试,因为没有静态部件,您可以为开发和生产环境定义不同的注册表……

依赖注入

依赖注入的第三个“最新”和最好的方法.
通常你会有一些框架为你做这件事.这个想法是,无论何时调用类的构造函数,所有依赖项(如数据库连接)都由框架注入.

这样您就可以轻松定义“用户需要DB和Redis.商店需要DB,Config和FTP”……
虽然这对于较小的项目来说是一个开销,但它对于大量且经过充分测试的项目有很大帮助.

如果您曾经升级到多个DB(例如一个主服务器和多个服务器),DI非常适合,因为您可以为代码的每个部分提供完成工作所需的数据库,而无需更改单行代码.

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读