php 前端控制器,前端控制器模式 - PHP教程 - CommandNotFound ⚡️ 坑否

显示行号

|

选择喜欢的代码风格

默认

GitHub

Dune

LakeSide

Plateau

Vibrant

Blue

Eighties

Tranquil

前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。

前端控制器模式就是给你的 web 应用程序设置单一的入口(比如 index.php),用来集中处理所有请求的机制,目前大多数的PHP框架是这种形式。

它的职责是载入所有依赖,处理请求,并发送响应给浏览器。前端控制器模式对整个架构是有益的,因为它鼓励模块化代码,并给了你一个单入口,可以写一些每个请求都需要跑的代码(比如输入数据的过滤)。

PHP 前端控制器模式扩展阅读:

前端控制器:单一入口,定义了一个中心入口文件,每个请求都需要从这个入口进入系统,当然也可以在这里对用户的输入请求进行过滤。前端控制器处理请求后选择适当的命令(处理业务的)。在PHP中,这种模式每次都需要初始化,所以会导致性能的下降,但好处还是显而易见的。

前端控制器处理的是请求,那么我们就需要把用户的请求进行处理。

下面是唯一入口的 index.php 的代码示例,包含一个简单的路由功能:

class Demo

{

private static $_instance;

public static $classMap;

public static $dirMap = array();

public function __construct()

{

self::$classMap = array(

'Component'=>'/core/Component.php',

'controllers\Controller'=>'/core/Controller.php',

'models\Model'=>'/core/Model.php',

);

}

public static function run()

{

self::$_instance = new self;

self::import('controllers');

self::import('models');

}

public static function route()

{

$request_uri = $_SERVER['REQUEST_URI'];

$route = preg_replace("/.*c.php\/?/",'',$request_uri);

$route = preg_replace("/\?.*/",'',$route);

$route = trim($route,'/');

empty($route) && $route = 'site/index';

$routeArr = explode('/',$route);

$controllerName = '';

$dir = 'controllers';

for($i=0,$c=count($routeArr);$i$actionName();

}

public static function import($dir)

{

$files = scandir(dirname(__DIR__).DIRECTORY_SEPARATOR.$dir);

foreach($files as $v)

{

if($v=='.' || $v=='..')

continue;

if(is_dir($dir.'/'.$v)){

$dotDir = preg_replace('/\//','.',$dir.'/'.$v);

in_array($dotDir,self::$dirMap) || self::$dirMap[] = $dotDir;

self::import($dir.'/'.$v);

continue;

}

$classname = substr($v,0,strpos($v,'.php'));

$classname =preg_replace('/\//','\\',$dir).'\\'.$classname;

self::$classMap[$classname] = '/'.$dir.'/'.$v;

}

}

public static function appendClassmap($arr=array())

{

self::$classMap = array_merge(self::$classMap,$arr);

}

public static function isAjax()

{

return isset($_POST['ajax']);

}

public static function autoload($className)

{

if(isset(static::$classMap[$className])){

$classFile = static::$classMap[$className];

}else{

$classFile = DIRECTORY_SEPARATOR.$className.'.php';

}

$classFile = dirname(__DIR__).$classFile;

if(!is_file($classFile)){

return;

}

include($classFile);

}

public static function err_404()

{

echo '404 Not Found!';

die;

}

}

//SPL注册自动加载

spl_autoload_register(['Demo', 'autoload'], true, true);

现在,只要在一个php文件中包含这个类文件,运行就可以了。

require 'core/Demo.php';

Demo::run();

Demo::route();//路由

发表评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值