Routing是官方文件The Basics的第一章,文件已將各種樣態的Route都做了解釋。因此,今天的日記僅針對筆者本身不瞭解的部分做統整,加強自身印象,常見的概念就不提囉。
//要求'title'為大小寫英文字母
Route::get('book/{title}',function ($title){
})->where('title','[A-Za-z]+');
//要求'title'為大小寫英文字母及'id'為數字0-9
Route::get('book/{title}/{id}',function ($title,$id){
})->where('title'=>'[A-Za-z]+','id'=>'[0-9]+');
如果你希望某個路由參數可以一直遵循Regular Expression Constraints,那麼我們可以使用pattern
方法,找到路徑位於/vendor/laravel/framework/src/Illuminate/Foundation/Support/Providers/
的RouteServiceProvider文件並在它的boot方法中定義。
//以id為例
public function boot()
{
Route::pattern('id','[0-9]+');
parent::boot();
}
當我們定義了pattern
後,會自動應用在有使用這個id參數名稱的所有路由
Route:;get('book/{id}',function($id){
//僅允許id為數字時執行
});
將相同的PHP命名空間分配給一組Controller,路由群組內的項目會加上相同的namespace。使用時機:routes具備共同的namespace,組成群組簡化編寫程序。
//App\Http\Controllers\Book\個別controllers(相同的namespace)
Route::namespace('Book')->group(function(){
Route::get('booktype','BooktypesController@show');
Route::get('bookTitles','BooktitlesController@show');
.
.
.
});
Laravel 會自動處理定義在路由或控制器行為中,與類型提示的變量名匹配的路由段名稱的Eloquent 模型,以官方文件所舉的例子來說明:
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
由於$user
變量被類型提示為Eloquent模型中的App\User,變量名又與URI中的{user}
匹配,因此,Laravel會將請求URI中傳入的ID相匹配的用戶模型實例自動注入。如果在數據庫中找不到對應的模型實例,將會自動生成404異常。
Implicit(隱性)相反的方式為Explicit(顯性),與前述Global Constraints的namespace位置及使用採用註冊綁定的boot方法相同。文件舉例:
//使用路由的model方法,給予一個參數去指定類。
Route::model('user',App\User::class);
綁定後要定義一個包含{user}
參數的路由
Route::get('profile/{user}', function (App\User $user) {
//
});
因為我們前面已將{user}
參數綁定到App\User
,因此User實例會從這個路由注入。eg:profile/1的請求意即將該筆ID為1的數據從資料庫中注入到User實例。
middleware是用來過濾'auth:api'對路由的訪問。使用訪問控制須將throttle middleware
指派給一個路由或路由組。throttle:60,1
接收的這兩個參數可以決定分鐘數內能進行的最大請求數,此處為每分鐘訪問平率不超過60次。
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
今天Routing的筆記就到這裡,如果有任何謬誤,請不吝指正,謝謝!