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对象中.我错过了什么?
我认为您\xe2\x80\x99正在描述某种模型的适配器或网关,其中您有一个调用适配器的类(它可能与数据库或XML数据源交互),然后将结果分配给您的模型(即将每个匹配的用户结果分配给您的User模型的一个实例)。
过去,我\xe2\x80\x99采用了您\xe2\x80\x99描述的方法,其中模型代表一个项目,然后使用 DAO 将这些项目保存和检索到数据源(可以是数据库)或其他),以及执行逻辑的控制器。所以一个非常基本的版本:
\n\n用户DAO.php
\n\n\n\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n\n用户.php
\n\nclass User\n{\n public $id;\n public $username;\n public $password;\n public $email;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n用户控制器.php
\n\nclass 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}\nRun Code Online (Sandbox Code Playgroud)\n\n希望这可以帮助。
\n