Laravel 技术笔记 (一)【Routing 路由】

序言

此系列文章将不定期更新,献给未来健忘的自己,也献给刚接触 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

<<:  使用Lucene.Net达成全文检索!基础解说(一)

>>:  # 冷知识: 0x000000E2 是什麽? 记忆体错误??

Day7 初探CFS scheduler (上)

前言 上次讲完了过去 Linux 的排程器,今天就来讲讲 CFS (complete fair sc...

用科学化除错方法替你的 zk 程序除错之二

b. 分析找到的资料并给出一个对根因的假设 在取得资料之後,就要针对这些资料提出一个假设。如果对 Z...

Day 2 - Two Sum

Day 2 - Two Sum 大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~...

Re: 新手让网页 act 起来: Day30 - React hooks 之 useDebugValue

前言 今天要介绍最後一个 React hook - useDebugValue ,它也是个较少使用的...

android studio 30天学习笔记-day 9-rxjava2补充

昨天介绍rxjava2简单的写法,今天会介绍rxjava2其他的做法 Observables RxJ...