Web MVC:如何构建Model层?

JDe*_*age 6 php model-view-controller

我将以一个user对象为例.用户需要注册,登录,注销,编辑(例如,电子邮件更改)等.

所以一方面我有一个user对象,它包括各种类变量(伪,电子邮件等)以及getter和setter,也许还有一些不处理db的函数.

另一方面,我有一个DAO类,它是通过各种MySQL/PDO查询直接处理数据库的对象(创建记录,更新,检索信息等).

是否有任何理由不让user对象直接与对象交互DAO?换句话说,当Controller请求与现有user实例相关的数据库查询时(例如,在注册过程中),它是否应该简单地调用user其自身调用函数的函数DAO,或者它们之间是否应该有一个层?

我见过控制器调用第3类与DAO交互的user示例,并将实例作为arg 传递.有时相反,第三层负责创建user实例并处理DAO.在我看来,用于处理的所有函数DAO都可以驻留在user对象中.我错过了什么?

Mar*_*ean 2

我认为您\xe2\x80\x99正在描述某种模型的适配器或网关,其中您有一个调用适配器的类(它可能与数据库或XML数据源交互),然后将结果分配给您的模型(即将每个匹配的用户结果分配给您的User模型的一个实例)。

\n\n

过去,我\xe2\x80\x99采用了您\xe2\x80\x99描述的方法,其中模型代表一个项目,然后使用 DAO 将这些项目保存和检索到数据源(可以是数据库)或其他),以及执行逻辑的控制器。所以一个非常基本的版本:

\n\n

用户DAO.php

\n\n\n\n
class UsersDAO extends DAO\n{\n    public function save(User $user)\n    {\n        return is_null($user->id) ? $this->insert($user)\n                                  : $this->update($user);\n    }\n\n    public function insert(User $user)\n    {\n        $sql = "INSERT INTO `users` (`username`, `password`)\n                VALUES (:username, :password)";\n\n        $stmt = $this->db->prepare($sql);\n        $stmt->bindParam(\':username\', $user->username);\n        $stmt->bindParam(\':password\', $user->password);\n        $stmt->execute();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

用户.php

\n\n
class User\n{\n    public $id;\n    public $username;\n    public $password;\n    public $email;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

用户控制器.php

\n\n
class UserController extends Controller\n{\n    public function register()\n    {\n        $usersDao = new UserDAO;\n\n        if ($_POST) {\n            $user = new User;\n            $user->username = $_POST[\'username\'];\n            $user->password = $_POST[\'password\'];\n\n            $userDao->save($user);\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这可以帮助。

\n