MVC(Model-View-Controller,模型-视图-控制器)是PHP最多见的一种开发模式。它将程序划分为三层。php
最上面的一层,是直接面向最终用户的
"视图层"(View)
。它负责给用户提供操做界面,是程序的外壳。html最底下的一层,是核心的
"模型层"(Model)
,负责检索、组织和处理程序所需的数据或信息。apache中间的一层,就是
"控制层"(Controller)
,它负责根据用户从"视图层"输入的指令,选取"模型层"中的数据,而后根据业务逻辑对其进行相应的操做,并产生最终结果。浏览器
Controller
控制器是Model
和View
二者交互的中介,Model模型层负责读写数据,View视图层负责视图处理输出。缓存
主要是经过伪静态来实现单一入口
,mvc框架都是这样。将全部请求经过apache伪静态解析转给某个指定文件,而后经过php的$_SERVER[]这个全局变量来去的请求的路径字符串,对其进行解析再分配给指定的类去处理,基本就是这样。
最简单的方法是创建一个.htaccess文件。文件内容贴给你安全
<IfModule !mod_rewrite.c> ErrorDocument 500 'mod_rewrite must be enabled' </IfModule> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php
将这个文件放在根目录下便可。文件做用很明显:将全部的请求路径转给index.php,而后在index.php里作请求字符串的判断便可打到路由解析功能。架构
单一文件入口应用,全部请求都是经过index.php接收并转发到功能代码中去,所以一些事情变得简单多了,如数据安全性检查,访问统计等。mvc
当前比较流行的一些PHP开发框架如Laravel、ThinkPHP等都是采用的单一入口模式。app
URL路由原理框架
基本思路就是浏览器端经过URL字符串
提供控制器类
的名字和方法
的名字,PHP据此找到对应的类和方法。
为方便测试,把全部功能写一个文件,实际框架每一个类为一个文件,入口一个文件。
<?php /** * PHP单一文件框架设计简析 * 一、MVC架构实现 * 二、URL路由原理 */ //URL路由原理 /** * 路由做用 * 获取url中的c和a变量,执行c类对应的方法a,实现不一样的路由 */ class App { public $c; public $a; public function run() { $c = isset($_GET['c']) ? $_GET['c'] : "Index"; //url提供类名字的变量名 $a = isset($_GET['a']) ? $_GET['a'] : "Index"; //url提供方法名字的变量名 $c .= "Controller"; if( class_exists($c) && method_exists($c, $a) ) { $o = new $c(); $o->$a(); }else{ echo "error"; exit(); } } } //MVC架构 /** * 模型层 * 获取应用数据做用 */ class Model { //TODO:link db、get data } /** * 视图类 * 编译、缓存及显示模板 */ class View { public function render($tpl) { echo "Hi, ".$tpl; //TODO:具体html模板 } } /** * 控制器 * 全部功能控制器继承该类 */ class Controller { public $view; public $model; public function __construct() { $this->view = new View(); $this->model = new Model(); } public function display($tpl = "") { echo $this->view->render($tpl); exit(); } } //具体功能开发 class IndexController extends Controller { /** * 网站首页 */ public function Index() { $this->display("Index"); } /** * 网站列表 */ public function List() { $this->display("List"); } } //单一文件入口 $app = new App(); $app->run(); ?>