PHP应用中如何让AltoRouter路由与控制器配合实现MVC架构
AltoRouter 适配MVC架构实现方案
核心实现逻辑:将路由目标从直接加载视图的闭包,改为指向控制器对应方法,请求匹配后先调用控制器完成业务逻辑处理,再由控制器加载视图返回,即可完成路由与MVC架构的适配。
修复现有代码问题
先修正现有控制器代码的语法错误和逻辑问题:
- 引入模型语句末尾缺失分号
- 实例化控制器语句末尾缺失分号
- 移除控制器文件底部的自动实例化逻辑,避免文件被引入时直接执行业务,交由路由层统一调度
- 不要在构造函数中直接调用业务方法,拆分独立的动作方法对应不同路由
修正后的控制器示例(建议存放路径app/Controllers/HomeController.php):
<?php // 引入对应模型类 require __DIR__ . '/../Models/Home.php'; class HomeController { /** * 首页业务逻辑 */ public function index() { // 调用模型层处理业务、获取数据 $homeModel = new Home(); $pageData = $homeModel->getData(); // 示例:从模型取首页渲染需要的数据 // 业务处理完成后,加载视图并传入数据 require __DIR__ . '/../../views/home.php'; } /** * 404页面逻辑 */ public function notFound() { require __DIR__ . '/../../views/error404.php'; } }
修改路由配置与调度逻辑
AltoRouter原生支持控制器类名#方法名格式的字符串作为路由目标,无需为每个路由写闭包。修改入口文件index.php代码:
<?php require 'vendor/altorouter/altorouter/AltoRouter.php'; // 引入控制器类,后续可接入Composer PSR-4自动加载替代手动引入 require __DIR__ . '/app/Controllers/HomeController.php'; $router = new AltoRouter(); // 路由映射规则:请求方式, 请求路径, 路由目标(控制器#方法), 路由别名(可选) $router->map('GET', '/', 'HomeController#index', 'home'); $router->map('GET', '/error404', 'HomeController#notFound', 'error404'); // 匹配当前请求 $match = $router->match(); // 路由调度 if (is_array($match)) { list($controllerName, $method) = explode('#', $match['target']); // 校验类和方法是否存在 if (class_exists($controllerName) && method_exists($controllerName, $method)) { $controller = new $controllerName(); call_user_func_array([$controller, $method], $match['params']); exit; } } // 无匹配路由跳转404 header('Location: /error404'); exit;
你现有的.htaccess规则不需要修改,可以直接复用。
最终请求流转流程
整套MVC架构的执行链路如下:
- 用户发起请求,
.htaccess将非静态资源请求统一转发到index.php入口文件 - AltoRouter匹配当前请求对应的控制器与方法
- 路由调度层实例化控制器,调用对应方法,传入路由参数
- 控制器接收参数,调用模型层完成数据处理、业务逻辑
- 控制器将处理完成的数据传递给视图,加载视图文件渲染内容
- 最终将渲染完成的响应返回给用户
优化建议
- 接入Composer的PSR-4自动加载能力,无需手动
require各类文件,提升可维护性 - 控制器层只负责参数校验、调度模型、传递数据到视图,不要直接写SQL或核心业务逻辑,数据操作统一收敛到模型层
- 视图层只负责数据展示,不要嵌入业务处理代码
内容的提问来源于stack exchange,提问作者Rémi LCD
相关产品推荐
相关产品推荐

