iT邦幫忙

0

Laravel 技術筆記 (一)【Routing 路由】

  • 分享至 

  • xImage
  •  

序言

此系列文章將不定期更新,獻給未來健忘的自己,也獻給剛接觸 Laravel 的初學者們,若您在觀看本系列文章後能有所收穫與成長,那將是我莫大的榮幸,廢話不多說,讓我們開始 Laravel 的探索之旅吧 ~
- Laravel 版本:9


路由定義

Laravel 的路由定義檔案位於 routes/web.php 中,以下是一組基本的路由定義:

Route::get('/', function () {
    return view('welcome');
});

這組程式碼是指當有使用者造訪 「/」(網域的根目錄)時,會執行匿名函式中的程式碼,也就是回傳名稱為 welcome 的 view 檔案(resources/views/welcome.blade.php)給使用者,最終會看到下面的這個畫面:
https://ithelp.ithome.com.tw/upload/images/20220224/20135794vmpmq83Jm5.jpg


路由重新導向

如果你要重新導向至另一路由,可搭配 Route::redirect() 使用:

/* 可使用第三個參數自定義狀態碼(預設為302) */
Route::redirect('/here', '/there', 301);

路由動詞

Laravel 可要求使用者發出 HTTP 請求時需匹配特定動詞才符合路由定義:

/* GET */
Route::get('/');
/* POST */
Route::post('/');
/* PUT */
Route::put('/');
/* PATCH */
Route::patch('/');
/* DELETE */
Route::delete('/');
/* 任何動詞都匹配 */
Route::any('/');
/* 自行定義,這裡示範 GET 與 POST */
Route::match(['get', 'post'], '/');

路由處理

除了回傳 view 之外,也可以使用字串傳遞 controller 名稱與方法:

/* 需使用 controller 的 namespace */
use App\Http\Controllers\UserController;
 
Route::get('/user', [UserController::class, 'index']);
/* controller 名稱空間與 method 名稱使用 @ 隔開 */
Route::get('/user', 'App\Http\Controllers\UserController@index');

上面兩種語法結果相同,只差在是否使用名稱空間,注意第二種語法需將 controller 的名稱空間輸入完整,否則 Laravel 會找不到目標。


路由參數

如果你定義的路由有參數,也能用以下的語法將參數傳入匿名函式:

Route::get('/user/{id}/profile', function ($id) {
    /* 參數 id 將被傳入 */
})
/* 在參數的後面加上 ? 可使參數變成選用,這種情況下也需定義預設值給路由 */
Route::get('/user/{id?}/profile', function ($id = 1) {
})

路由名稱

在專案其他地方要引用路由時,可先替路由命名,就可以使用 route() 引用路由:

/* 在路由後方使用 name 替路由命名 */
Route::get('/user/profile', function () {
})->name('profile');
/* 使用 route() 引用路由 */
route('profile')
/* 傳遞參數給 route() */
route('profile', ['id' => 1])

路由前綴

若有路由共用一組路徑名稱,可使用 prefix() 進行設定:

/* 範例中代表請求路徑需符合 admin/users 才會匹配路由 */
Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
    });
});

路由群組

若有複數路由共用 middleware、prefix 等等設定可將路由群組化:

/* 使用 group 將複數路由群組化,範例中兩組 Route::get() 路由將同時套用相同的 middleware 設定 */
Route::middleware(['first', 'second'])->group(function () {
    Route::get('/');
    Route::get('/user/profile');
});

路由速率限制

如果要限制使用者只能在一段時間內訪問路由的次數:
(1) 在 App\Providers\RouteServiceProvider 檔案內定義速率限制

/* 第一個參數為此速率限制的名稱,可自行隨意命名,範例為每分鐘限制1000次 */
protected function configureRateLimiting()
{
    RateLimiter::for('global', function (Request $request) {
        return Limit::perMinute(1000);
    });
}
/* 可使用 response() 自行定義超出限制時回傳的內容 */
RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000)->response(function () {
        return response('Custom response...', 429);
    });
});
/* 可使用 by() 取得使用者 IP 並限制訪問路由的次數 */
RateLimiter::for('global', function (Request $request) {
            return Limit::perMinute(1000)->by($request->ip())->response(function () {
                return response('Custom response...', 429);
            });
        });

(2) 將上面設定好的路由限制器 global 加到路由上

/* 透過 middleware() 將速率限制器加到路由上 */
Route::middleware(['throttle:global'])->group(function () {
    Route::post('/audio', function () {
    });
});

備用路由

若希望在其他路由都沒有匹配的情況下執行備用的路由,可使用 Route::fallback():

/* 注意!!備用路由應該是你所有定義路由中的最後一個 */
Route::fallback(function () {
});

路由快取

在將專案部署上線後,可搭配路由快取,加速載入的時間:

$ php artisan route:cache

清除路由快取:

$ php artisan route:clear

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言