PHP实现路由映射到指定控制器

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

SimpleLoader.php

<?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'],'<font color="red">Fatal Error</font> '.$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="\r\n";
 }else{
  $break="<br/>";
 }
 $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

<?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);

控制器啥样
\Controller\User\User.php

<?php
namespace Controller\User;

class User{
 public function getUserById(){
 echo "用户信息id {$_GET['id']} 的信息";
 }
 public function getUserList(){
 echo "用户列表";
 }
 public function getUserArticle(){
 echo "用户id {$_GET['uid']} 的文章列表";
 }
}

效果呢:

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

(0)

相关推荐

  • 自制PHP框架之路由与控制器

    我们为什么要使用路由?原因1:一个更漂亮的URI 1.URI的改进 刚刚开始学PHP时,我们一定写过blog.php?id=1之类的URI,使用GET方式获取参数.这样的URI有两个缺点,一是容易被SQL注射攻击,二是维护性可读性差,大家可以比较下面两种URI哪一种更具备可读性. www.mysite.com/blog.php?id=1 上面URI是我们初学PHP最常用的. www.mysite.com/blog/1 这种URI是目前最流行的URI,举个例子,比如很多读书类,电影类网站,都使用了

  • php处理restful请求的路由类分享

    复制代码 代码如下: <?php    class Router {        // 路由表        private $routers = array(            array("name"=>"userlist", "pattern"=>"get /user", "action"=>"User#get"),            array(

  • ThinkPHP路由详解

    有了基本配置,我们就可以来访问我们的应用默认首页了.进入到项目目录,可以直接使用PHP内置服务器来开始访问,比如: php -S localhost:8999 浏览器输入localhost:8999就可以看到ThinkPHP的默认首页了:一个笑脸. 在这里,我们访问到的是ThinkPHP自带的默认入口文件index.php也就是访问到的是IndexController的index()方法,这是因为ThinkPHP默认设置: 'DEFAULT_CONTROLLER' => 'Index' 如果你查

  • php url路由入门实例

    一.什么是php的路由机制 1.路由机制就是把某一个特定形式的URL结构中提炼出来系统对应的参数.举个例子,如:http://main.test.com/article/1  其中:/article/1  -> ?_m=article&id=1. 2.然后将拥有对应参数的URL转换成特定形式的URL结构,是上面的过程的逆向过程. 二.PHP的URL路由方式 总体来说就是:获取路径信息->处理路径信息 URL路由方式: 第一种是通过url参数进行映射的方式,一般是两个参数,分别代表控制器

  • thinkphp的URL路由规则与配置实例

    本文实例讲述了thinkphp的URL路由规则与配置方法.分享给大家供大家参考.具体分析如下: 一.URL规则 1.默认是区分大小写的 2.如果我们不想区分大小写可以改配置文件 复制代码 代码如下: 'URL_CASE_INSENSITIVE'=>true,//url不区分大小写 3.如果模块名为 UserGroupAction,那么url找模块就必要要写成 复制代码 代码如下: http://localhost/thinkphp4/index.php/user_group/index 4.如果

  • thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)

    复制代码 代码如下: <?php //thinkphp 路由定义规则  $route = array(  'news/:action/:year\d/:month/:day'=>'news/read?year=:2&month=:3&day=:4',    'news/:action^delete|update|insert/:year\d/:month/:day'=>array(                'news/read?extra=:2&status

  • Laravel 5框架学习之路由、控制器和视图简介

    查看 app/Http/routes.php 复制代码 代码如下: Route::get('/', 'WelcomeController@index'); @是一个界定符,前面是控制器,后面是动作,表示当用户请求url / 的时候,执行控制器 WelcomeController 中的 index 方法 复制代码 代码如下: app/http/controllers/welcomecontroller.php public function index() { return view('welco

  • ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼

    前言 读过一篇关于Zend Framework2的技术文章<ZF2多级树形路由Route配置实例>,是介绍路由配置的.我觉得很有意思,这是的需求: /user对应用户列表页面 /user/:user_id对应用户的个人主页,比如 /user/AlloVince 就对应AlloVince用户的个人主页 /user/:user_id/blog/对应用户的博客列表页面,比如 /user/AlloVince/blog 就会列出AlloVince写过的Blog /user/:user_id/blog/:

  • PHP URL路由类实例

    前段时间写了个关于手机应用的api,一直是用的query_string这种地址,而且还是根据一个act参数来区分所有的动作,这种让开发人员看起来比较费眼.本来想改写为"?c=controller&m=method&type=3&id=1" 这种形式,利用m参数来载入文件并进行实例化,后来看了sina weibo api 是对地址进行了路由.也决定跟风对地址路由.本来CI框架自己自带路由效果,但是因为考虑是写api,想写的比较纯粹一点.支持默认控制器(index)

  • PHP实现路由映射到指定控制器

    自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本 SimpleLoader.php <?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::path

  • laravel csrf排除路由,禁止,关闭指定路由的例子

    百度了下,发现别的教程里需要更改文件,实际上很简单,官方提供了接口可以用来设置; laravel的csrf防范是通过app/http/Middleware目录下的中间件VerifyCsrfToken.php来生效的,如下所示在官方的代码 有个属性$except,可以专门用来设置哪些路由不用做csrf验证: <?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken a

  • vue的路由映射问题及解决方案

    今天在项目中遇到了一个问题,明明在Router文件夹下的路由js映射文件中,配置好了,如下: // 生日贺卡 { path: 'birthdayRemind', component: load('@/components/app/birthdayRemind/BirthdayRemind')} 然后我是通过进入home页面,点击一个图标,进入到这个生日贺卡页面,路径如下: const tmpConfig = [ { funcName: '生日贺卡', link: '/home/0/work/bi

  • vue 点击按钮 路由跳转指定页面的实现方式

    目录 点击按钮 路由跳转指定页面 最终效果 vue跳转页面常用的方式 1:router-link跳转 2:this.$router.push() 3.this.$router.replace() 4.this.$router.go(n) ps : 区别 点击按钮 路由跳转指定页面 最终效果 点击指定按钮,跳转指定 /login 页面 代码: <button @click="gotolink" class="btn btn-success">点击跳转页面&

  • 利用Nginx代理如何解决前端跨域问题详析

    前言 Nginx(发音同"engine X")是异步框架的网页服务器,也可以用作反向代理.负载平衡器和HTTP缓存. 本文将讲述如何使用 Nginx 在 Web 前后端分离开发中实现路由的转发. Web 开发通常使用的是前后端分离的开发模式,即前端和后端分别进行开发,前端通过 Ajax 请求后端的接口,将获取数据将数据渲染到页面上.前端开发会使用脚手架搭建前端开发环境,其底层通常会启动一个本地服务器,通常使用的是 nodejs 的 Express 框架.而后端则是提供接口,一般是放在线

  • Laravel框架中的路由和控制器操作实例分析

    本文实例讲述了Laravel框架中的路由和控制器操作.分享给大家供大家参考,具体如下: 路由 简介: 将用户的请求转发给相应的程序进行处理 作用:建立url和程序之间的映射 请求类型:get.post.put.patch.delete 目录:app/http/routes.php 基本路由:接收单种请求类型 //get请求 Route::get('hello1',function(){ return 'hello world'; }) //post请求 Route::post('hello2',

  • [译]ASP.NET Core 2.0 路由引擎详解

    本文介绍了ASP.NET Core 2.0 路由引擎详解,分享给大家,具体如下: 问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvir

  • Yii2创建控制器(createController)方法详解

    本文实例讲述了Yii2创建控制器(createController)方法.分享给大家供大家参考,具体如下: yii中创建控制器的是在application中的request通过UrlManager解析得出路由信息的,然后再由yii\base\Module中的 public function runAction($route, $params = []) 方法来创建控制器,最后由控制器再执行相应的动作. 首先得明确,Yii中的路由分三种情况: 第一种是带有模块的(module id/control

  • ASP.NET MVC4入门教程(二):添加一个控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉您如何使用它们来构建应用程序. 首先,让我们创建一个控制器类.在解决方案资源管理器中,用

  • ASP.NET Core MVC学习教程之路由(Routing)

    前言 ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序的URL命名形式,使得它在搜索引擎优化(SEO)和链接生成中运行良好,而不用关心Web服务器上的文件是怎么组织的.我们可以方便的使用路由模板语法定义路由,路由模板语法支持路由值约束,默认值和可选值. 基于约束的路由允许全局定义应用支持的URL格式,以及这些格式是怎样各自在给定的控制器中映射到指定的操作方法(Action

随机推荐