tp5的路由

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

普通模式:html

//配置文件關閉路由,徹底使用默認的PATH_INFO方式URL
'url_route_on'  =>  false,

關閉路由後的普通模式任然能夠經過操做方法的參數綁定、控制器和空操做等特性實現url地址的簡化ajax

強制模式:thinkphp

//配置文件以下配置
'url_route_on'          =>  true,
'url_route_must'        =>  true,

//這種方式下面必須嚴格給每個訪問地址定義路由規則(包括首頁),不然將拋出異常。

//首頁的路由規則採用/定義便可,例以下面把網站首頁路由輸出Hello,world!
Route::get('/',function(){
    return 'Hello,world!';
});

 

混合模式:api

//開啓路由,並使用路由定義+默認PATH_INFO方式的混合
//配置以下
'url_route_on'  =>  true,
'url_route_must'=>  false,
//該方式下面,只須要對須要定義路由規則的訪問地址定義路由規則,其它的仍然按照第一種普通模式的PATH_INFO模式訪問URL

動態註冊路由配置兩種方式數組

因爲檢測機制問題,動態註冊的性能比路由配置要高一些,尤爲是多種請求類型混合定義的時候。瀏覽器

動態註冊:緩存

路由定義採用\think\Route類的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'=>'\app\index\behavior\UserCheck',//前置行爲(檢測)
        'after_behavior'=>'\app\index\behavior\ReadInfo',//後置行爲(執行)
        '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+']
);

 

 

規則表達式

一般包含靜態地址和動態地址,或者兩種地址的結合,例以下面都屬於有效的規則表達式:app

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 think\Route;
// 註冊路由到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 think\Route;
Route::alias('home','index/index');
Route::alias('admin','admin/index');
或者:
return [

    '__alias__' =>  [
        'home'  =>  'index/index',
       'admin'=> 'admin/index'
    ],

];

 

use think\Route;
// 註冊路由到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+']
);

//變量規則
//一、設置單個路由全局的變量規則
Route::rule('new/:tittle','News/update');
// 設置tittle變量規則(採用正則定義)
Route::pattern('name','\w+');
//二、批量設置路由全局規則
Route::rule('new/:tittle','News/update');
Route::rule('banner/:id','home/Goods/banner');
Route::pattern([
    'tittle'  =>  '\w+',
    'id'    =>  '\d+',
]);
//三、設置局部變量規則,僅在當前路由有效
Route::get('new/:name','News/read',[],['name'=>'\w+']);

//四、完整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'=>'\app\index\behavior\UserCheck',//前置行爲(檢測)
        'after_behavior'=>'\app\index\behavior\ReadInfo',//後置行爲(執行)
        '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::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.三、路由到動態的模塊、控制器或者操做
//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','\app\index\service\Blog@read');//執行的是 \app\index\service\Blog類的read方法
Route::rule('blog/:id','\app\index\service\Blog::read');
//V5.0.4+版本開始,支持傳入額外的參數做爲方法的參數調用(用於參數綁定),例如:
Route::rule('blog/:id','\app\index\service\Blog::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','\app\index\controller\User');


//路由分組  容許把相同前綴的路由定義合併分組
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('\app\index\controller','namespace');//經過http://serverName/blog/read/id/5就能夠直接訪問 \app\index\controller\Blog類的read方法。

// 綁定到類
Route::bind('\app\index\controller\Blog','class');//經過http://serverName/read/id/5就能夠直接訪問 \app\index\controller\Blog類的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}
相關文章
相關標籤/搜索