批改状态:合格
老师批语:
Model:模型类,数据库操作
View:视图类,展示到客户端
Controller:控制器,协调模型与视图
MVC目录架构:
具体代码如下:
Model.php
namespace core;use PDO;abstract class Model{protected $db;public function __construct($dsn,$username,$password){$this->db = new PDO($dsn,$username,$password);}public function getAll($num){$sql = "SELECT * FROM `bittel` LIMIT ?;";$stmt = $this->db->prepare($sql);$stmt->bindParam(1,$num,PDO::PARAM_INT);if($stmt->execute()){return $stmt->fetchAll(PDO::FETCH_ASSOC);}else{print_r($stmt->errorInfo());print_r($stmt->debugDumpParams());}}}
namespace core;class View{//1.创建模板变量protected array $data = [];//2.模板赋值public function assign(string $key, $value){$this->data[$key] = $value;}//3.模板渲染public function render($path, $data = []){//判断是否有数据传入if ($data) {foreach ($data as $key => $value) {$this->assign($key, $value);}}//数组解构extract($this->data);file_exists($path) ? include $path : die('模板文件不存在');}}
namespace core;abstract class Controller{//模型对象protected Model $model;//视图对象protected View $view;public function __construct($model,$view){//初始化两个对象$this->view = $view;$this->model = $model;}}
namespace core;//路由类class Router{public static function parse(){// 默认控制器,实际项目,应该来自配置文件,而不是在写死$controller = 'User';$action = 'user';// 参数列表$params = [];// 判断是否存在pathinfoif (array_key_exists('PATH_INFO', $_SERVER) && $_SERVER['PATH_INFO'] !== '/') {// 为什么要判断 $_SERVER['PATH_INFO'] !== '/' ?// 因为: admin.php/ 时,$_SERVER['PATH_INFO'] = '/', 导致解析控制器失败$pathinfo = array_filter(explode('/', $_SERVER['PATH_INFO']));// dump($pathinfo);// 考虑到index.php/ 情况, 这时pathinfo为空数组if (count($pathinfo) >= 2) {$controller = array_shift($pathinfo);$action = array_shift($pathinfo);$params = $pathinfo;} else {$controller = array_shift($pathinfo);}}// 查看控制器,方法,参数// dump($controller, $action, $params);// 将这些数据返回出去return [$controller, $action, $params];}}
use core\Model;class UserModel extends Model{public function __construct($dsn, $username, $password){parent::__construct($dsn, $username, $password);}}
use core\Model;class UserModel extends Model{public function __construct($dsn, $username, $password){parent::__construct($dsn, $username, $password);}}
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>分页展示数据</title><style>table {margin: auto;width: 600px;border-collapse: collapse;text-align: center;}table th,table td {border: 1px solid;padding: 5px;}table thead {background-color: lightcyan;}table caption {font-size: larger;margin-bottom: 8px;}body>p {display: flex;}p>a {text-decoration: none;color: #555;border: 1px solid;padding: 5px 10px;margin: 10px 2px;}.active {background-color: seagreen;color: white;border: 1px solid seagreen;}</style></head><body><table><caption><h3>用户信息表</h3></caption><thead><tr><th>ID</th><th>姓名</th><th>性别</th><th>邮箱</th></tr></thead><tbody><?php foreach ($users as $user) :extract($user) ?><tr><td><?=$id?></td><td><?=$name?></td><td><?=$sex?'女':'男' ?></td><td><?=$email?></td></tr><?php endforeach ?></tbody></table></body></html>
namespace Mvc;use controller\UserController;use model\UserModel;use core\View;// 入口文件: 测试// 1.类的自动 composer的自动加载器require 'vendor/autoload.php';// 2. 实例化控制器$model = new UserModel('mysql:dbname=bittel', 'root', 'root');//print_r($model);//echo $model;$view = new View();$users = new UserController($model, $view);// 3. 调用控制器中的方法$users->getDate(10);
namespace Mvc;use core\Router;use core\View;use Model\UserModel;require 'vendor/autoload.php';require 'model/UserModel.php';$request = Router::parse();$controller = array_shift($request);$method = array_shift($request);$params = array_shift($request);// 生成控制器名称$controller= 'controller\\'. ucfirst($controller). 'Controller';//echo $controller;//die();$model = new UserModel('mysql:dbname=bittel', 'root', 'root');//print_r($model);//echo $model;$view = new View();$users = new $controller($model, $view);call_user_func_array([$users, 'getDate'], $params);

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号