路由模式:普通、強制和混合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}