从ASP转学PHP,经常看到一个PHP文件例如“index.php”能显示很多不同的页面,本以为是通过if判断$_GET[]参数,或者是switch,但是通过查看index.php文件发现不是这个原理,请问这样的效果是如何实现的 ?
比如DISCUZ论坛很多页面都在是index.php文件里处理的....
能不能提供一个简单的源码学习?
谢谢各位解答
PHP中文网2017-04-10 15:55:01
首先是Web服务器把不存在的路径转给index.php处理,比如Nginx:
location / {
try_files $uri $uri/ /index.php?$args;
}
然后前端控制器index.php做URL路由分发,比如Symfony官方文档的前端控制器index.php示例:
index.php //前端控制器(路由):
<?php
// 加载并初始化任何全局库
require_once 'model.php'; //模型(CRUD)
require_once 'controllers.php'; //控制器(调用模型的CRUD函数,载入视图模板)
// 在内部路由用户的请求(用函数parse_url分析REQUEST_URI很方便)
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ('/index.php' == $uri) {
list_action();
} elseif ('/index.php/show' == $uri && isset($_GET['id'])) {
show_action($_GET['id']);
} else {
header('Status: 404 Not Found');
echo '页面未找到';
}
controllers.php //控制器(调用模型,载入视图)
<?php
function list_action() {
$posts = get_all_posts(); // 模型model.php里的函数
require 'templates/list.php'; // 视图
}
function show_action($id) {
$post = get_post_by_id($id); // 模型model.php里的函数
require 'templates/show.php'; // 视图
}
Discuz!有些页面用的是页面控制器,而不是前端控制器,viewthread.php就是一个页面控制器.页面控制器+common.php结合也是一个不错方法,这样浏览器就能直接访问页面控制器,而不需要经过前端控制器进行路由.