zoukankan      html  css  js  c++  java
  • tp5的路由

    路由模式:普通、强制和混合

    普通模式:

    //配置文件关闭路由,完全使用默认的PATH_INFO方式URL
    'url_route_on'  =>  false,

    关闭路由后的普通模式任然可以通过操作方法的参数绑定、控制器和空操作等特性实现url地址的简化

    强制模式:

    //配置文件如下配置
    'url_route_on'          =>  true,
    'url_route_must'        =>  true,
    
    //这种方式下面必须严格给每一个访问地址定义路由规则(包括首页),否则将抛出异常。
    
    //首页的路由规则采用/定义即可,例如下面把网站首页路由输出Hello,world!
    Route::get('/',function(){
        return 'Hello,world!';
    });

    混合模式:

    //开启路由,并使用路由定义+默认PATH_INFO方式的混合
    //配置如下
    'url_route_on'  =>  true,
    'url_route_must'=>  false,
    //该方式下面,只需要对需要定义路由规则的访问地址定义路由规则,其它的仍然按照第一种普通模式的PATH_INFO模式访问URL

    动态注册路由配置两种方式

    由于检测机制问题,动态注册的性能比路由配置要高一些,尤其是多种请求类型混合定义的时候。

    动态注册:

    路由定义采用 hinkRoute类的rule方法注册,通常是在应用的路由配置文件application/route.php进行注册,格式是

    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    请求类型不指定的话默认为任何请求类型包含(GET、POST、PUT、DELETE、*表示任何其他请求)
    单个注册:
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    批量注册:
    Route
    ::rule( [ '路由规则1'=>'路由地址和参数', '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)'] ], '', '请求类型', '匹配参数(数组)', '变量规则' ); Route::rule( [ 'new/:id' => 'News/read', 'blog/:id' => ['Blog/update',['ext'=>'shtml'],['id'=>'d{4}'] ], ], '', 'GET', ['ext'=>'html'], ['id'=>'d+'] );


    路由地址:
    // 路由到默认或者绑定模块
    'blog/:id'=>'blog/read',
    // 路由到index模块
    'blog/:id'=>'index/blog/read',
    //多级控制
    'blog/:id'=>'index/group.blog/read',//路由到index/controller/group/Blog
     
    Route::rule(
        'theme/:id/[:name]',
        'home/Goods/theme',
        'GET',
        [
            'method'=>'POST|GET|PUT',//请求类型检测
            'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
            'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
            'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
            'https'=>true,//检测是否https请求
            'before_behavior'=>'appindexehaviorUserCheck',//前置行为(检测)
            'after_behavior'=>'appindexehaviorReadInfo',//后置行为(执行)
            'callback'=>'my_check_fun',//自定义检测方法
            'merge_extra_vars'=>true,//合并额外参数
            'cache'=>3600,//请求缓存V5.0.1+
            'bind_model'=>['User','name'],//绑定模型V5.0.1+
            'param_depr'=>'',//路由参数分隔符V5.0.2+
            'ajax'=>true,//V5.0.2+
            'pjax'=>true,//V5.0.2+
    
    
        ],
        ['name'=>'w+','id'=>'d+']
    );

    规则表达式

    通常包含静态地址和动态地址,或者两种地址的结合,例如下面都属于有效的规则表达式:

    Route::rule('/', 'index'); // 首页访问路由
    Route::rule('my', 'Member/myinfo'); // 静态地址路由
    Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合
    Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合
    Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址

    当控制器文件不再controler文件夹下而是在controller子文件夹下时我们定义路由地址格式为[子文件名.  控制器名]

    如:

    //controller/v1/Banner.php  访问为:http://www.localhost/api/v1/banner/1 
    Route::get("api/v1/banner/:id","api/v1.Banner/getBanner");
    
    //下面是动态调用(如不同版本)
    Route::get("api/:version/banner/:id","api/:version.Banner/getBanner");
    //当前新品
    Route::get("api/:version/product/recent","api/:version.Product/getRecent");

    ThinkPHP5.0的路由规则定义是从根目录开始,而不是基于模块名的。

    application/route.php注册   然后访问变成http://serverName/new/5

    use thinkRoute;
    // 注册路由到index模块的News控制器的read操作
    Route::rule('new/:id','index/News/read');

    不同的请求类型定义路由规则的简化方法:请求类型参数必须大写

    Route::get('new/:id','News/read'); // 定义GET请求路由规则
    Route::post('new/:id','News/update'); // 定义POST请求路由规则
    Route::put('new/:id','News/update'); // 定义PUT请求路由规则
    Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则
    Route::any('new/:id','News/read'); // 所有请求都支持的路由规则
    //如果要定义get和post请求支持的路由规则,也可以用:
    Route::rule('new/:id','News/read','GET|POST');

    参数可选定义

    Route::get('blog/:year/[:month]','Blog/archive'); //变量用 [ ] 包含起来后就表示该变量是路由匹配的可选变量
    
    下面的URL访问地址都可以被正确的路由匹配:
    http://serverName/index.php/blog/2015
    http://serverName/index.php/blog/2015/12

    路由标志:设置一个唯一的用于url生成的字符

    // 注册路由到index模块的News控制器的read操作
    Route::name('new_read')->rule('new/:id','index/News/read');
    //生成路由地址的时候就可以使用
    url('new_read',['id'=>10]);
    //如果不定义路由标识的话,使用下面的方式生成
    url('index/News/read',['id'=>10]);
    
    V5.1.6+ 版本开始,路由标识的用法调整,原来的用法:
    // 注册路由到index模块的News控制器的read操作
    Route::name('new_read')->rule('new/:id','index/News/read');
    需要改为:
    // 注册路由到index模块的News控制器的read操作
    Route::rule('new/:id','index/News/read')->name('new_read');
    因为后者更符合语义。

    路由别名:Route::alias('别名','模型/控制器');

    use thinkRoute;
    Route::alias('home','index/index');
    Route::alias('admin','admin/index');
    或者:
    return [
    
        '__alias__' =>  [
            'home'  =>  'index/index',
           'admin'=> 'admin/index'
        ],
    
    ];
    use thinkRoute;
    // 注册路由到index模块的News控制器的read操作
    Route::rule('show/:id','test/Index/index');//id必须
    Route::rule('show/[:id]','test/Index/index');//id可选
    Route::rule('new/:id','News/update','POST');//第三个参数为空则表示接受所有的请求类型的参数
    //完全匹配
    Route::rule('show/:id$','test/Index/index');//只有http://www.admindemo2.com/show/2才能访问而去掉$的话http://www.admindemo2.com/show/2/3/tom/...也能通过
    //全局完全匹配(开启全局完全匹配后所有的都不用再加$)
    //配置文件添加
    //'route_complete_match'  =>  true,//开启路由定义的全局完全匹配
    //当开启全局完全匹配的时候,如果个别路由不需要使用完整匹配,可以添加路由参数覆盖定义:
    //Route::rule('new/:id','News/read','GET|POST',['complete_match' => false]);
    
    
    
    Route::get('routeget','test/Index/routeGet'); // 定义GET请求路由规则,同Route::rule('routeget','test/Index/routeGet','GET');//只接受get的请求
    Route::get('routeget/:id','test/Index/routeGet'); // 同//Route::rule('routeget/:id','test/Index/routeGet','GET');//只接受get的请求
    //注意: Route::get('routeget','test/Index/routeGet');与Route::get('routeget/:id','test/Index/routeGet');同时定义相当于Route::get('routeget/[:id]]','test/Index/routeGet');文档说明:注册多个路由规则后,系统会依次遍历注册过的满足请求类型的路由规则,一旦匹配到正确的路由规则后则开始调用控制器的操作方法,后续规则就不再检测 所以为了避免冲突最好将优先级高的放在最前面(比如单个设置的变量规则和路由规则放前面,全局的放在最后面)
    Route::rule('routepost','test/Index/routePost','POST');//post的请求才能接受
    Route::rule('routepostorget','test/Index/routePostOrGet','POST|GET');//只接受get和post请求,其他一律不接受
    
    
    // 定义new路由命名标识
    Route::rule(['name','routenameflag/:id'],'test/Index/routeNameFlag');
    //http://www.admindemo2.com/routenmeflag/1
    //{:url('name',['id'=>1])}
    Route::rule(['name2','routenameflag2/'],'test/Index/routeNameFlag2');//第二个参数有没有/都无所谓
    //http://www.admindemo2.com/routenmeflag2 or //http://www.admindemo2.com/routenmeflag2/
    //{:url('name2')}
    Route::rule(['name3','routenameflag3/[:id]'],'test/Index/routeNameFlag3');
    //http://www.admindemo2.com/routenmeflag3 or //http://www.admindemo2.com/routenmeflag3/1
    //{:url('name3')} or //{:url('name',['id'=>1])}
    
    
    
    
    //批量注册:
    Route::rule(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
    Route::get(['new/:id'=>'News/read','blog/:name'=>'Blog/detail']);
    
    /*
    
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    
    Route::rule(
        [
            '路由规则1'=>'路由地址和参数',
            '路由规则2'=>['路由地址和参数','匹配参数(数组)','变量规则(数组)']
        ],
        '',
        '请求类型',
        '匹配参数(数组)',
        '变量规则'
    );
    
    */
    
    Route::rule(
        [
            'new/:id'  =>  'News/read',
            'blog/:id' =>  ['Blog/update',['ext'=>'shtml'],['id'=>'d{4}']],
            ':action/blog/:id' => 'index/blog/:action',// action变量的值作为操作方法传入
            ':c/:a'=> 'index/:c/:a',// 变量传入index模块的控制器和操作方法    
        ],
        '',
        'GET',
        ['ext'=>'html'],
        ['id'=>'d+']
    );
    
    //变量规则
    //1、设置单个路由全局的变量规则
    Route::rule('new/:tittle','News/update');
    // 设置tittle变量规则(采用正则定义)
    Route::pattern('name','w+');
    //2、批量设置路由全局规则
    Route::rule('new/:tittle','News/update');
    Route::rule('banner/:id','home/Goods/banner');
    Route::pattern([
        'tittle'  =>  'w+',
        'id'    =>  'd+',
    ]);
    //3、设置局部变量规则,仅在当前路由有效
    Route::get('new/:name','News/read',[],['name'=>'w+']);
    
    //4、完整URL规则
    Route::get('allurl/:catergory','test/Index/allUrl',[],['__url__'=>'allurl/[A-Za-z0-9]{1,}$']);//id必须
    
    
    //组合变量
    //http://www.admindemo2.com/item-sb or http://www.admindemo2.com/item-sb555  or http://www.admindemo2.com/item-sb555a
    /*Route::get('item-<name><id?>','test/Index/product',[],['name'=>'w+','id'=>'d+']);*/
    // http://www.admindemo2.com/item-sb-555
    Route::get('item-<name>-<id>','test/Index/product',[],['name'=>'w+','id'=>'d+']);
    
    
    
    Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
    
    Route::rule(
        'theme/:id/[:name]',
        'home/Goods/theme',//路由地址
        'GET',
        [
            'method'=>'POST|GET|PUT',//请求类型检测
            'ext'=>'shtml|html|php',//检测是shtml|html|php这三个后缀的请求就通过
            'deny_ext'=>'jpg|png|gif',//URL禁止后缀检测,这里禁止检测jpg|png|gif者三个后缀
            'domain'=>'news.thinkphp.cn',//子域名检测则直接news就行'domain'=>'news']
            'https'=>true,//检测是否https请求
            'before_behavior'=>'appindexehaviorUserCheck',//前置行为(检测)
            'after_behavior'=>'appindexehaviorReadInfo',//后置行为(执行)
            'callback'=>'my_check_fun',//自定义检测方法
            'merge_extra_vars'=>true,//合并额外参数
            'cache'=>3600,//请求缓存V5.0.1+
            'bind_model'=>['User','name'],//绑定模型V5.0.1+
            'param_depr'=>'',//路由参数分隔符V5.0.2+
            'ajax'=>true,//V5.0.2+
            'pjax'=>true,//V5.0.2+
    
    
        ],
        ['name'=>'w+','id'=>'d+']
    );
    
    
    //路由地址
    
    //1、额外参数:
    Route::get('extraparams/:id','test/Index/extraParam?status=1&app_id=5'); 
    // http://www.admindemo2.com/extraparams/2/3  访问
    // Request::instance()->route()能获取到id、status、app_id
    
    //2 路由到模块/控制器   [模块/控制器/]操作?参数1=值1&参数2=值2...
    //2.1 路由到默认或者绑定模块
    Route::rule('blog/:id','index/read');
    //2.2 路由到index模块
    Route::rule('blog/:id','test/index/read');
    
    //2.3、路由到动态的模块、控制器或者操作
    //http://www.admindemo2.com/moviemodel/index/1  访问到的是test/Index/movieModel()
    Route::rule(':action/index/:id','test/Index/:action');
    //http://www.admindemo2.com/moviemodel/lichihua/1  访问到的是test/Index/movieModel()
    Route::rule(':action/lichihua/:id','test/Index/:action');
    
    
    
    
    //4 路由到操作方法  @[模块/控制器/]操作
    //'blog/:id'=>'@index/blog/read',   系统会直接执行 Loader::action('index/blog/read');
    //这种方式看起来似乎和第一种是一样的,本质的区别是直接执行某个控制器类的方法,而不需要去解析 模块/控制器/操作这些,同时也不会去初始化模块,视图的默认模板规则失效,所以这种情况下面,如果使用了视图模板渲染,则必须传入明确的参数
    Route::get('test/:id','@test/Index/dongTest?status=1'); //??
    
    //路由到类的方法     路由地址的格式为(动态方法):类的命名空间类名@方法名  或者(静态方法):类的命名空间类名::方法名
    
    //可以支持执行任何类的方法,而不仅仅是执行控制器的操作方法
    Route::rule('blog/:id','appindexserviceBlog@read');//执行的是 appindexserviceBlog类的read方法
    Route::rule('blog/:id','appindexserviceBlog::read');
    //V5.0.4+版本开始,支持传入额外的参数作为方法的参数调用(用于参数绑定),例如:
    Route::rule('blog/:id','appindexserviceBlog::read?status=1');
    
    //路由到重定向地址  以/或者http 开头
    Route::rule('wolichihua/:id','/test/:id');
    //http://www.admindemo2.com/wolichihua/1  访问到了est/Index/dongTest即上面定义的test/:id'
    
    
    
    //资源路由
    //在指向index模块的blog控制器新建index()、create($id)、save、read($id)、eidit($id)、update($id)、delete($id)方法然后动态注册(资源路由会自动注册7个路由规则分别对应这几个方法) 详情参考资源路由
    Route::resource('blog','index/blog');
    //或者路由配置
    return [
        // 定义资源路由
        '__rest__'=>[
            // 指向index模块的blog控制器
            'blog'=>'index/blog',
        ],
        // 定义普通路由
        'hello/:id'=>'index/hello',
    ];
    
    //快捷路由  Route::controller('user','模块/控制器');
    // 给User控制器设置快捷路由  控制器方法为 请求类型+方法名  如getInfo()与postInfo()
    // get http://localhost/user/phone   post http://localhost/user/info
    Route::controller('user','index/User');
    
    
    //路由别名
    //我们希望使用user可以访问Home模块的User控制器的所有操作  那么我么定义别名为
    Route::alias('user','home/User');
    //或者
    return [
        '__alias__' =>  [
            'user'  =>  'home/User',
        ],
    ];
    
    //路由别名可以指向任意一个有效的路由地址,例如下面指向一个类
    // user 路由别名指向 User控制器类
    Route::alias('user','appindexcontrollerUser');
    
    
    //路由分组  允许把相同前缀的路由定义合并分组
    Route::group('blog',[
        ':id'   => ['Blog/read', ['method' => 'get'], ['id' => 'd+']],
        ':name' => ['Blog/read', ['method' => 'post']],
    ],['ext'=>'html']);
    
    
    
    //MISS路由:没有匹配到所有的路由规则后执行一条设定的路由,可以使用MISS路由功能, MISS路由配置后相当于开启了强制路由
    //全局MISS路由   
    //Route::miss(); 放到路由的第一行才能生效,放到最后一行或者return里面不生效?????
    Route::miss('public/miss');//当没有匹配到所有的路由规则后,会路由到 public/miss路由地址。
    //分组MISS路由  分组支持独立的MISS路由
    //
    //
    //闭包支持:
    Route::get('hello/:name',function($name){ 
        return 'Hello,'.$name;
    });
    //闭包还支持模板师视图
    Route::get('/', function () {
        return view('admin@home/index');
    });
    
    //路由绑定
    // 绑定当前的URL到 index模块
    Route::bind('index');
    // 绑定当前的URL到 index模块的blog控制器
    Route::bind('index/blog');//http://serverName/index/blog/read/id/5可以简化成http://serverName/read/id/5 ;如果定义了路由Route::get('index/blog/:id','index/blog/read');那么访问URL就变成了http://serverName/5
    
    // 绑定当前的URL到 index模块的blog控制器的read操作
    Route::bind('index/blog/read');
    
    // 绑定命名空间
    Route::bind('appindexcontroller','namespace');//通过http://serverName/blog/read/id/5就可以直接访问 appindexcontrollerBlog类的read方法。
    
    // 绑定到类
    Route::bind('appindexcontrollerBlog','class');//通过http://serverName/read/id/5就可以直接访问 appindexcontrollerBlog类的read方法。
    
    //入口文件绑定
    // 复制一份入口文件添加define('BIND_MODULE','admin'); 命名为demo.php 我们访问这个demo.php就访问的是admin模块
    
    // 自动入口绑定
    // 配置文件开启入口文件自动绑定模块   'auto_bind_module'  =>  true,
    //复制一份index.php 改名为demo.php  访问index.php是访问index模块 访问的demo.php则访问得是demo模块
    
    //域名路由   省略

    定义路由后参数的获取问题:

    Route::get('hello/:id','index/test/hello');
    以下三种是获取不到值的:
    dump(request()->get());
    dump(request()->get('id'));
    dump(input('get.id'));
    我们只有通过:下面这几个才能获取到
    dump(request()->param());
    dump(request()->param('id'));
    dump(request()->route());
    dump(request()->route('id'));
    怎么才能让get获取到?
    参数绑定和?后面的如:
    public function hello($id){
        dump(request()->get());
        dump(input('get.'));
    }
    浏览器输入:域名/hello/10?name=123
    array (size=2)
      'name' => string '123' (length=3)
      'id' => string '10' (length=2)

    路由之后这些方法的controller和action的的值与实际的不同了

    11.// 调用Request对象的path方法
    12.{$Request.path}
    13.// 调用Request对象的module方法
    14.{$Request.module}
    15.// 调用Request对象的controller方法
    16.{$Request.controller}
    17.// 调用Request对象的action方法
    18.{$Request.action}
  • 相关阅读:
    制作一个html中闪动的title 来提示消息
    Unicode与 utf8的互相转换
    程序员找女友的类
    使用php将数组转为XML
    自己动手画一个HTML5的按钮
    浏览器推通知给桌面
    如何使用定时任务
    封装之property,多态,鸭子类型,classmethod与staticmethod
    面向对象
    继承与派生
  • 原文地址:https://www.cnblogs.com/lichihua/p/10405374.html
Copyright © 2011-2022 走看看