iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
0

Routing是官方文件The Basics的第一章,文件已將各種樣態的Route都做了解釋。因此,今天的日記僅針對筆者本身不瞭解的部分做統整,加強自身印象,常見的概念就不提囉。

正規表示式的約束 Regular Expression Constraints

//要求'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]+'); 

全局約束 Global Constraints

如果你希望某個路由參數可以一直遵循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為數字時執行
});

路由群組下的命名空間 The Namespaces of Route Groups

將相同的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');
                                .
                                .
                                .
});

路由模型綁定 Route Model Binding

1.Implicit Binding

Laravel 會自動處理定義在路由或控制器行為中,與類型提示的變量名匹配的路由段名稱的Eloquent 模型,以官方文件所舉的例子來說明:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

由於$user變量被類型提示為Eloquent模型中的App\User,變量名又與URI中的{user}匹配,因此,Laravel會將請求URI中傳入的ID相匹配的用戶模型實例自動注入。如果在數據庫中找不到對應的模型實例,將會自動生成404異常。

2.Explicit Binding

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實例。

訪問控制 Rate Limiting

middleware是用來過濾'auth:api'對路由的訪問。使用訪問控制須將throttle middleware指派給一個路由或路由組。throttle:60,1接收的這兩個參數可以決定分鐘數內能進行的最大請求數,此處為每分鐘訪問平率不超過60次。

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

今天Routing的筆記就到這裡,如果有任何謬誤,請不吝指正,謝謝!


上一篇
Day14-Laravel新手基礎訓-PostMan的Collection / Variables / Console
下一篇
Day16-Laravel新手基礎訓- The Basic Middleware
系列文
後端PHP+Laravel--新手實戰日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言