php控制器实现自动映射,PHP实现路由映射到指定控制器

自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本

SimpleLoader.php

class SimpleLoader{

public static function run($rules=array()){

header("content-type:text/html;charset=utf-8");

self::register();

self::commandLine();

self::router($rules);

self::pathInfo();

}

//自动加载

public static function loadClass($class){

$class=str_replace("\", "/", $class);

$dir=str_replace("\", "/", __DIR__);

$class=$dir."/".$class.".php";

if(!file_exists($class)){

header("HTTP/1.1 404 Not Found");

}

require_once $class;

}

//命令行模式

public static function commandLine(){

if(php_sapi_name()=="cli"){

$_SERVER["PATH_INFO"]="";

foreach ($_SERVER["argv"] as $k=>$v) {

if($k==0) continue;

$_SERVER["PATH_INFO"].="/".$v;

}

}

}

//路由模式

public static function router($rules){

if(isset($_SERVER["PATH_INFO"]) && !empty($rules)){

$pathInfo=ltrim($_SERVER["PATH_INFO"],"/");

foreach ($rules as $k=>$v) {

$reg="/".$k."/i";

if(preg_match($reg,$pathInfo)){

$res=preg_replace($reg,$v,$pathInfo);

$_SERVER["PATH_INFO"]="/".$res;

}

}

}

}

//pathinfo处理

public static function pathInfo(){

if(isset($_SERVER["PATH_INFO"])){

$pathinfo=array_filter(explode("/", $_SERVER["PATH_INFO"]));

for($i=1;$i<=count($pathinfo);$i++){

$key=isset($pathinfo[$i]) ? $pathinfo[$i] : "";

$value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :"";

switch ($i) {

case 1:

$_GET["m"]=ucfirst($key);

break;

case 2:

$_GET["c"]=ucfirst($key);

break;

case 3:

$_GET["a"]=$key;

break;

default:

if($i>3){

if($i%2==0){

$_GET[$key]=$value;

}

}

break;

}

}

}

$_GET["m"]=!empty($_GET["m"]) ? ucfirst($_GET["m"]) : "Index";

$_GET["c"]=!empty($_GET["c"]) ? ucfirst($_GET["c"]) : "Index";

$_GET["a"]=!empty($_GET["a"]) ? $_GET["a"] : "index";

$class="\Controller\{$_GET["m"]}\{$_GET["c"]}";

$controller=new $class;

if(method_exists($controller, $_GET["a"])){

$controller=new $class;

$controller->$_GET["a"]();

}else{

header("HTTP/1.1 404 Not Found");

echo "404";

}

}

//致命错误回调

public static function shutdownCallback(){

$e=error_get_last();

if(!$e) return;

self::myErrorHandler($e["type"],"Fatal Error ".$e["message"],$e["file"],$e["line"]);

}

//错误处理

protected static function myErrorHandler($errno,$errstr,$errfile,$errline){

list($micseconds,$seconds)=explode(" ",microtime());

$micseconds=round($micseconds*1000);

$micseconds=strlen($micseconds)==1 ? "0".$micseconds : $micseconds;

if(php_sapi_name()=="cli"){

$break="

";

}else{

$break="
";

}

$mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break;

echo $mes;

}

//注册

public static function register(){

error_reporting(0);

set_error_handler(function($errno,$errstr,$errfile,$errline){

self::myErrorHandler($errno,$errstr,$errfile,$errline);

});

register_shutdown_function(function(){

self::shutdownCallback();

});

spl_autoload_register("self::loadClass");

}

}

如何使用

index.php

//路由映射

$rules=array(

"^user$"=>"User/User/getUserList",

"^user/(d+)$"=>"User/User/getUserById/id/$1",

"^user/(d+)/article$"=>"User/User/getUserArticle/uid/$1"

);

require_once "SimpleLoader.php";

SimpleLoader::run($rules);

控制器啥样

ControllerUserUser.php

namespace ControllerUser;

class User{

public function getUserById(){

echo "用户信息id {$_GET["id"]} 的信息";

}

public function getUserList(){

echo "用户列表";

}

public function getUserArticle(){

echo "用户id {$_GET["uid"]} 的文章列表";

}

}

效果呢:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算几何】点在多边形内部

问题描述&#xff1a;已知点P(x,y)和多边形Poly&#xff0c;判断点P(x,y)是否在多边形内部。 基本方法&#xff1a;射线法 以点P为端点&#xff0c;向左方作射线L&#xff0c;由于多边形是有界的&#xff0c;所以射线L的左端一定在多边形外部&#xff0c;考虑沿着L从无究远处开…

php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

phalcon(费尔康)框架学习笔记以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里&#xff0c;推荐php版本>5.4)环境不支持伪静态网址时的配置第一步&#xff1a;在app\config\config.ini文件中的[application]节点内修改baseUri参数值为/invo/index.php/或/invo/in…

php查找空白行,如何从PHP文本中删除空白行?

小编典典// New line is required to split non-blank linespreg_replace("/(^[\r\n]*|[\r\n])[\s\t]*[\r\n]/", "\n", $string);上面的正则表达式说&#xff1a;/(^[\r\n]*|[\r\n])[\s\t]*[\r\n]/1st Capturing group (^[\r\n]*|[\r\n])1st Alternative: …

Hungary(匈牙利算法)——二分图最大匹配

在复习匈牙利算法的时候&#xff0c;发现这么一篇介绍匈牙利算法的文章&#xff0c;非常通俗易懂&#xff0c;所以就借鉴过来了。 复杂度&#xff1a;邻接矩阵&#xff1a;O&#xff08;v^3&#xff09;邻接表&#xff1a;O&#xff08;V*E&#xff09; 附上链接&#xff1a;趣…

js图片压缩java上传,JS实现异步上传压缩图片

摘要: 使用iframe来处理异步上传图片&#xff0c;在现在这个时代来说&#xff0c;多多少少都有点落后了&#xff01;单单就凭AJAX和JS就不能做到异步上传图片了吗&#xff1f;先看调用页面&#xff1a;选择图片var img;$("input:file").change(function (){//console…

白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)...

转自&#xff1a;http://wenda.tianya.cn/wenda/thread?tid758a1e447e62b7df&hlja 白盒测试作为测试人员常用的一种测试方法&#xff0c;越来越受到测试工程师的重视。白盒测试并不是简单的按照代码设计用例&#xff0c;而是需要根据不同的测试需求&#xff0c;结合不同的…

matlab getsplitpic,MATLAB_9-模式识别笔记

1&#xff0c;识别单独字符的&#xff1a;思想&#xff1a;picsize[20,10];创建一个矩阵&#xff0c;将两个照片整理成大小一致的。具体就是使用后面的&#xff1a;aimresize(a,picsize);fontsABCDEFGHNVJXSMQ;建立字符串用于匹配输出(就是识别的功能&#xff01;)下面一个for循…

浅谈android4.0开发之GridLayout布局

作者:李响 本文重点讲述了自android4.0版本号后新增的GridLayout网格布局的一些基本内容&#xff0c;并在此基础上实现了一个简单的计算器布局框架。通过本文&#xff0c;您可以了解到一些android UI开发的新特性&#xff0c;并可以实现相关应用。 在android4.0版本号之…

解扰matlab,数据序列扰乱与解扰MATLAB实现及性能分析—利用m序列.doc

数据序列扰乱与解扰MATLAB实现及性能分析—利用m序列《数据序列的扰乱与解扰的MATLAB实现及性能分析—利用17级m序列》 第 PAGE 1页 共20页数据序列的扰乱与解扰的MATLAB实现及性能分析—利用17级m序列学生姓名&#xff1a; 指导老师&#xff1a;摘要 本课程设计主要为了进一步…

ThinkPHP---RBAC

一、什么是RBAC 基于角色的访问控制&#xff08;Role-Based Access Control&#xff09;作为传统访问控制&#xff08;自主访问&#xff0c;强制访问&#xff09;的有前景的代替受到广泛的关注。 在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而…

c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法

最近用 MySqlBulkLoader 向MySql数据库批量上传数据遇到了些问题&#xff0c;做下记录问题1&#xff1a;如图原因&#xff1a;版本不合&#xff0c;使用的MySql版本和引用的mysql.data 版本不和解决方案&#xff1a;用nuget将mysql.data升级到对应版本&#xff0c;如果是MySql8…

Nim教程【七】

这是国内第一个关于Nim的系列教程 先说废话 很开心&#xff0c;在今天凌晨快一点多的时候拿到了 nim-lang.com&#xff1b;nim-lang.cn&#xff1b;nim-lang.net 这三个域名&#xff0c;到不是为了投资&#xff0c;准备用nim-lang.com做一个社区出来 不知道国内有没有人或者机构…

验证必须是数字php,Element 中表单非必填数据项 必须为数字的验证问题

Element-ui 的el-form组建中&#xff0c;自带基本的验证功能&#xff0c;比如某些项必填的验证&#xff0c;直接加入rules 规则中即可&#xff0c;如下实例&#xff1a;在页面中书写如下&#xff1a;在vue 初始化data中filterForm: {firstDay: ,lastDay: },rules: {firstDay: […

为开发者准备的9个实用PHP代码片段(转)

[导读] 当你开发网站、app或博客系统时&#xff0c;如果有一些实用的代码片段可以直接使用&#xff0c;就可以节省你大量的时间和精力。这篇文章就为你分享几个实用的PHP代码片段&#xff0c;帮助你的Web开发。 本文由PHP100中文网编译&#xff0c;转载请看文末的转载要求&…

idea 自动生产序列吗,IDEA自动生成序列化Id

实体对象实现了java.io.Serializable接口后&#xff0c;一般都会提供一个serialVersionUID以做版本区分。在idea里&#xff0c;可以通过设置来快速生成serialVersionUID。设置方法1、打开Preferences–>Editor–>Inspections&#xff0c;然后在右侧输入UID进行搜索(搜索方…

ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法

Ionic中[弹出式窗口]有两种&#xff08;如下图所示&#xff09;&#xff0c;$ionicModal和$ionicPopup; $ionicModal是完整的页面&#xff1b; $ionicPopup是(Dialog)对话框样式的&#xff0c;直接用JavaScript设定对话框的一些参数&#xff0c;通常用于通知消息、确认等作用&a…

php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例

ReflectionParameter::getDefaultValueConstantName()函数是PHP中的内置函数&#xff0c;如果默认值为常数或null&#xff0c;则用于返回默认值的常数名称。用法:string ReflectionParameter::getDefaultValueConstantName ( void )参数&#xff1a;该函数不接受任何参数。返回…

php表单中姓名必须使用汉字,我想在表单验证中加入中文姓名合法性模糊匹配判断?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼刚开始只是想检验一下输入的是不是中文&#xff0c;后来学了正则表达式后&#xff0c;想尝试一下&#xff0c;把常见的姓氏通过字符串判断的形式&#xff0c;主要是对姓氏进行验证&#xff0c;当然还有输入长度&#xff0c;可我对自…

php实现购物车 redis,redis 哈希数据类型简单操作(实现购物车案例)

这里不累赘如何安装redis和php redis扩展&#xff0c;主要熟悉调用redis哈希数据类型如图简单方法操作如下1&#xff1a;hSet2:hGet4:hDel5:hGetAll4:hExists5:hIncrBy简单购物车实现namespaceHome\Controller;useThink\Controller;useOrg\Net\Http;useThink\Cache\Driver\Red…

写在25岁

虽然到25岁&#xff0c;大家会告诉你女人容颜开始衰退&#xff0c;要多加注意保养&#xff0c;要学会化妆&#xff0c;要会穿高跟鞋。虽然到25岁&#xff0c;大家告诉你要赶紧结婚生子&#xff0c;否则女人开始贬值。虽然到25岁&#xff0c;大家会告诉你工作不要那么拼&#xf…