PHP一个文件显示多个不同页面是什么机制?
Jun 06, 2016 pm 08:30 PM
从ASP转学PHP,经常看到一个PHP文件例如“index.php”能显示很多不同的页面,本以为是通过if判断$_GET[]参数,或者是switch,但是通过查看index.php文件发现不是这个原理,请问这样的效果是如何实现的 ?
比如DISCUZ论坛很多页面都在是index.php文件里处理的....
能不能提供一个简单的源码学习?
谢谢各位解答
回复内容:
从ASP转学PHP,经常看到一个PHP文件例如“index.php”能显示很多不同的页面,本以为是通过if判断$_GET[]参数,或者是switch,但是通过查看index.php文件发现不是这个原理,请问这样的效果是如何实现的 ?
比如DISCUZ论坛很多页面都在是index.php文件里处理的....
能不能提供一个简单的源码学习?
谢谢各位解答
首先是Web服务器把不存在的路径转给index.php处理,比如Nginx:
<code>location / { try_files $uri $uri/ /index.php?$args; } </code>
然后前端控制器index.php做URL路由分发,比如Symfony官方文档的前端控制器index.php示例:
<code>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'; // 视图 } </code></code>
Discuz!有些页面用的是页面控制器,而不是前端控制器,viewthread.php就是一个页面控制器.页面控制器+common.php结合也是一个不错方法,这样浏览器就能直接访问页面控制器,而不需要经过前端控制器进行路由.
这是“单入口”的做法,现在一般的框架都这么做。其实你想的没错,代码跟进去会发现里面确实是类似switch路由分发处理的。
php框架目前都喜欢使用单入口模式 通过路由分到不同控制器 易于框架管理
php单一入口模式详细讲解
如果没有其他参数的话,根据我的猜测,有几个可能。一是 ajax 。二是嵌入了 frame 。还有可能页面本身就有很多内容,只是有些前段暂时隐藏了。
路由分发实现 iframe嵌套 include引入
这实际上是设计导致的,单入口模式。
index.php 一定包含了其他文件,通过路由分发到不同的页面,再执行不同的逻辑后使用页面渲染。
这些都是入口统一,然后通过钩子调用不同的应用,MVC模式的分层结构。架构交流群:231566327

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법
