ThinkPHP6.0學習筆記-路由操做

ThinkPHP-路由

by:Mirror王宇陽php

Thinkphp的路由的主要做用是爲了讓URL地址更加美觀、簡潔、優雅……;設置路由對URL的檢測、驗證等操做提供了極大的便利性;路由功能是默認開啓的config/app.php文件中設置:html

'with_route'	=>	true;
  • 路由配置文件:config/route.phpajax

  • 路由定義文件:route/app.phpjson

route目錄下的定義文件的文件名是隨機的,都會有效。跨域

路由定義

定義一次路由測試的文件:Address.php數組

class Address
{
    public function index()
    {
        return 'index';
    }
    public function details($id)
    {
        return 'details目前調用的ID'.$id;
    }
}
  • 未定義路由規則的狀況下,默認的URL訪問方法瀏覽器

    http://xxx.com/Index.php/address/id/5
  • 定義URL路由規則,在route/app.php定義文件中配置緩存

    Route::rule('details/:id','Address/details')
    http://xxx.com/Index.php/details/5

    路由規則配置完成後,必須使用路由規則進行訪問;不然視爲非法請求安全


註冊路由定義

Route::rule('路由表達式','路由地址','請求類型')

路由表達式:泛指路由訪問規則閉包

路由地址:泛指訪問目標的地址(控制器/方法/參數)

請求類型:默認 -> any

類型 描述 快捷方法
GET GET請求 get
POST POST請求 post
PUT PUT請求 put
DELETE DELETE請求 delete
PATCH PATCH請求 patch
* 任何請求類型 any

快捷註冊路由定義

Route::[快捷方法名]('路由表達式','路由地址')

示例:

Route::rule('details/:id','Address/details')
    
URL:http://xxx.com/Index.php/details/5

註冊rule路由到Address控制器的details

強制路由:設置開啓了強制路由,全部訪問都會要求按照路由訪問規則進行,不然報錯;

// 是否強制使用路由
'url_route_must'        => true,

首頁路由配置:(反斜槓就是首頁地址)

Route::rule('/','Index/index');

閉包支持

閉包支持咱們直接經過URL執行,而不須要經過控制器方法:

Route::get('think', function () {
    return 'hello,ThinkPHP6!';
});
Route::get('think', function ($id) {
    return 'hello!'.$id;
});

路由規則表達式

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

// 靜態路由
Route::rule('ads','Address/index');
[URL]=> tp/Index.php/ads
// 靜態+動態路由
Route::rule('datails/:id','Address/details');
[URL]=> tp/Index.php/details
// (多參數)靜態+動態路由
Route::rule('search/:id/:uid','Address/search');
[URL]=> tp/Index.php/search/1/1
// 全動態地址 不會限制search參數固定
Route::rule(':search/:id/:uid','Address/search');
[URL]=> tp/Index.php/search/1/1
[URL]=> tp/Index.php/s/1/1
// 可選參數地址
Route::rule('blog/:year/[:month]','Address/blog');
// 徹底匹配地址
Route::rule('search/:id/:uid$','Address/search');
[URL]=> tp/Index.php/search/1/1
    
//在路由配置文件中能夠開啓全局路由徹底匹配
//開啓徹底匹配後,使用`completeMatch(false)`關閉
// 額外參數 (隱式傳值)
// 路由跳轉支持傳入不顯示在URL中參數
Route::rule('blog/:id','blog/read')
    ->append(['status'=>1,'app_id'=>5]);

路由標識

根據路由生成URL地址,定義路由的時候指定生成惟一性標識

// 定義標識
Route::rule('blog/:year/:month','Adderss/blog')
    ->name('route_blog');
return url('route_blog',
	['year'=>$year,'month'=>$month]
);

變量規則

系統默認的路由變量規則是\w+ ;能夠在路由配置文件中修改變量規則

使用pattern()方法,能夠對參數變量進行規則設置:

Route::rule('details/:id','Address/details')
    ->pattern(['id'=>'\d+']);

pattern()接收數組傳遞,支持設置多個參數變量的規則

Route::pattern([
   'id'		=>	'\d+',
   'uid'	=>	'\d+'
]);

在路由定義文件中能夠用上述方法定義全局規則

支持使用組合變量規則方式,實現路由規劃:

Route::rule('details-<id>','Address/details')
    ->pattern('id','\d+');

動態組合拼裝:

Route::rule('details-:name-:id','Hello:name/index')
    ->pattern('id','\d+')

路由地址

路由的地址通常爲:控制器/操做方法

Route::rule('/','Index/index.php');

多級控制器,路由地址

Route::rule('details/:id','group.Blog/details');

完整路徑的操做方法:完整類名@操做方法

靜態方法的地址操做:完整類名::靜態方法

路由使用::readirect()方法實現重定向跳轉


路由參數

設置路由的時候,能夠設置相關的方法進行,從而實施匹配檢測和行爲執行

參數 說明 方法名
ext URL後綴檢測,支持匹配多個後綴 ext
deny_ext URL禁止後綴檢測,支持匹配多個後綴 denyExt
https 檢測是否https請求 https
domain 域名檢測 domain
complete_match 是否完整匹配路由 completeMatch
model 綁定模型 model
cache 請求緩存 cache
ajax Ajax檢測 ajax
pjax Pjax檢測 pjax
json JSON檢測 json
validate 綁定驗證器類進行數據驗證 validate
append 追加額外的參數 append
middleware 註冊路由中間件 middleware
filter 請求變量過濾 filter

ext方法是檢測URL後綴

Route::rule('details/:id','Address/details')->ext('html');

https方法檢測是否爲https請求

Route::rule('details/:id','Address/details')
    ->https()
    ->ext('html');

若是你須要批量設置路由參數,也可使用option方法。

Route::get('new/:id', 'News/read')
    ->option([
        'ext'   => 'html',
        'https' => true
    ]);

域名路由

限制在某域名下才解析路由

Route::domain('baidu.com',function(){
    Route::rule('blog/:id','Address/blog')
})

域名路由支持路由參數的操做

跨域請求

瀏覽器的安全機制會攔截非同源(跨域)的請求;在Thinkphp路由中,使用allowCrossDomain()來實現跨域請求,設置後該條路由就會容許非同源的請求:

Route::rule('details/:id'.'Address/details')
    ->allowCrossDomain();

同時爲了安全考慮(不是什麼人均可以來我這的)支持限制指定的跨站請求:

Route::rule('details/:id'.'Address/details')
    ->allowCrossDomain([
        'Access-Control-Allow-Origin' => "http://baidu.com"
    ]);

路由分組

路由分組,將相同前綴的路由合併分組,簡化路由定義有利於匹配和維護;

使用group()進行分組路由註冊:

Route::group('address',function(){
    Route::rule(':id','Address/details'),
    Route::rule(':name','Address/search');
})->pattern(['id'=>'\d+','name'=>'\w+']);

group()的第一參數能夠省略,第一參數僅僅是給路由設置了一個公共路由設置參數,第一參數添加後就能夠省略路由規則的內容,上述和下面兩個程序對比就有效果;不過若是簡寫了規則名,就會發生訪問衝突,這是就須要使用pattern() 限制每一參數的接收範圍 不建議簡寫;我的更建議用下面的這種方法來分組。

Route::group('add',function(){
    Route::rule('de/:id','Address/details'),
    Route::rule('se/:name','Address/search');
});
[URL] => tp/Index.php/add/de/1

使用prefix()能夠省略分組地址中的控制器

Route::group('add',function(){
    Route::rule('de/:id','details'),
    Route::rule('se/:name','search');
})->prefix('Address/');

路由規則在解析的時候會消耗較多的內存資源,尤爲是路由規則特別龐大的時候;

這裏能夠開啓延遲解析來節約內存空間(只有匹配到才執行路由)

MISS路由

全局MISS:相似開啓強制路由功能,匹配不到相應規則自動跳到MISS;

Route::miss('public/miss');
// 閉包
Route::miss(function(){
    return '404 Not Found!';
});

局部/分組MISS:在分組中使用,不知足匹配規則調整到該分組

Route::group('add',function(){
    Route::rule('de/:id','details'),
    Route::rule('se/:name','search'),
    Route::miss('miss')
})->prefix('Address/');

域名MISS路由:支持該路由設置單獨MISS路由

Route::domain('blog', function () {
    // 動態註冊域名的路由規則
    Route::rule('new/:id', 'news/read');
    Route::rule(':user', 'user/info');
    Route::miss('blog/miss');
});

資源路由

資源路由:採用固定的經常使用方法實現簡化URL的功能;

建立資源路由

Route::resource('[資源規則名]','[訪問路徑]');
class Address
{
    public function index()
    {
        return 'index';
    }
    public function details($id)
    {
        return 'details目前調用的ID=>'.$id;
    }
    public function search($name)
    {
        return "Name => ".$name;
    }
    public function blog($year,$month)
    {
        return url('route_blog',['year'=>$year,'month'=>$month]);
    }
}

建立Address的資源控制器後,在路由定義文件中註冊資源路由

Route::resource('add','Address');

資源路由被被成功註冊後就會自動完成方法匹配:

index ==> Address/index -> index

details ==> Address/details-> details/:id

search ==> Address/search -> search/:name

blog ==> Address/blog -> blog/:year/:month

vars()修改默認參數名稱;參數默認採用$id名稱

Route::resource('add','Address')
    ->vars(['add'=>'add_id']);

在控制器中也要相應的修改

only()限定系統提供的資源方法

Route::resource('add','Address')
    ->only(['index','search','blog']);

except()排除系統提供的資源方法

Route::resource('add','Address')
    ->except(['index']);

rest()更改系統的默認方法(請求方法、地址、操做)

Route::rest('create',['GET','/:id/add','add'])

嵌套資源路由

……

註解路由

路由的註解方式不是系統默認支持,須要安裝擴展:

composer require tohthink/think-annotation

引入相關類庫:use think\annotation\Route

完成簡單的引入以後,在控制端設置註解代碼便可,使用PHPDOC生成一段;而後添加路由規則;

/**
 * @parom $id
 * @return string
 * @route("details/:id");
 */

註解模式支持資源路由:

use think\annontation\Route\Resource;
/**
 * @Resource("blog")
 */

註解模式支持分組:

use think\annontation\route\Group;
/**
 * @Group('ads')
 */

URL生成

使用Route::buildUrl()獲取路由的URL地址

Route::buildUrl('地址',[參數]……)
public function details($id)
{
	return Route::buildUrl('Url/details',['id'=>$id]);
}

若是給路由定義了一個別名,就能夠在buildUrl()中使用;

同時可使用助手函數url()來代替;

相關文章
相關標籤/搜索