1. 基本使用
1.1 自定义路由文件
laravel8 中如果想要自定义路由文件和laravel级一下版本不一样。
1)routes 文件夹下新增 myWeb.php
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
*/
Route::get('/hello', function () {
return 'Hello World';
});
2) 路由服务提供者(app/Providers/RouteServiceProvider.php
)
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
// 新增:自定义的一个路由文件
Route::middleware('myWeb')
->namespace($this->namespace)
->group(base_path('routes/myWeb.php'));
});
}
3)app/Providers/RouteServiceProvider.php
新增 ‘myWeb’ => [] 这一段数组配置
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
// 新增的
'myWeb' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
4)测试:ok
1.2 路由基本方法
1.2.1 支持的六种基本路由方法
Route::get('/test_get', fn() => 'test_get');
Route::post('/test_post', fn() => 'test_post');
Route::put('/test_put', fn() => 'test_put');
Route::patch('/test_patch', fn() => 'test_patch');
Route::delete('/test_delete', fn() => 'test_delete');
Route::options('/test_options', fn() => 'test_options');
1.2.2 匹配多种或者匹配任意一种
// match 匹配多个
Route::match(['get', 'post'], '/test_match', fn() => 'match ok');
// any 匹配任意一个
Route::any('/test_any', fn() => 'any ok');
2. 文件路由(路由+控制器)
2.1 基本例子
1)先创建一个控制器 php artisan make:controller User
, 然后写入代码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class User extends Controller
{
// 新增的代码
public function index(): array
{
$arr1 = [4, 5];
return [1, 2, 3, ...$arr1, 6, 7];
}
}
2)路由文件中添加路由
// 路由文件,laravel8 后面的写发用数组代替了
Route::get('/user', [User::class, 'index']);
3)postman:测试结果
3. 路由重定向
3.1 redirect 和 permanentRedirect
// 路由重定向
Route::redirect('/here', '/there');
// 默认情况, Route::redirect 返回的状态码是 302 。 但你可以使用第三个可选参数自定义状态码:
Route::redirect('/here', '/there', 301);
// Route::permanentRedirect 方法返回 301 状态码
Route::permanentRedirect('/here', '/there');
Route::get('/there', fn() => 'redirect there');
4. 视图路由
5. 路由参数
5.1 必填参数
路由的参数通常都会被放在 {} ,并且参数名只能为字母。 下划线 (_) 也可以用于路由参数名中。路由参数会按路由定义的顺序依次注入到路由回调或者控制器中 - ,而不受回调或者控制器的参数名称的影响。
// 单个参数
Route::get('/user/{id}', fn($id) => 'User ' . $id);
// 多个参数
Route::get('/posts/{post}/comments/{comment}', fn($postId, $commentId) => $postId . ';' . $commentId);
5.2 可选参数
有时,你可能需要指定一个路由参数,但你希望这个参数是可选的。你可以在参数后面加上 ? 标记来实现,但前提是要确保路由的相应变量有默认值:
Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});
5.3 正则表达式约束
你可以使用路由实例上的 where 方法约束路由参数的格式。where 方法接受参数名称和定义参数应如何约束的正则表达式:
Route::get('/user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
5.4 参数和依赖注入
如果您的路由具有依赖关系,而您希望 Laravel 服务容器自动注入到路由的回调中,则应在依赖关系之后列出路由参数:
use Illuminate\Http\Request;
Route::get('/user/{id}', function (Request $request, $id) {
return 'User '.$id;
});
[
](https://web.postman.co/workspace/My-Workspace~d91e38ca-47d4-4d0e-808d-376ff45f37f5/request/11423621-176a9ca6-3bd9-4868-afb4-754144b8d2a5)
5.5 全局约束
如果你希望某个具体的路由参数都遵循同一个正则表达式的约束,就使用 pattern 方法。你应该在 App\Providers\RouteServiceProvider 类的 boot 方法中定义这些:
/**
* 定义你的路由模型绑定, pattern 过滤器等
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
}
6. 路由命名
路由命名可以方便地为指定路由生成 URL 或者重定向。通过在路由定义上链式调用 name 方法可以指定路由名称:
注意:路由命名必须是唯一的
Route::get('/user/profile', function () {
//
})->name('profile');Copy
你还可以指定控制器行为的路由名称:
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');Copy
6.1 生成指定路由的 URL
一旦为路由指定了名称,你可以在生成 url 或者通过 Laravel 的 route 和 redirect 辅助函数重定向时使用路由的名字:
// 生成链接...
$url = route('profile');
// 生成重定向...
return redirect()->route('profile');Copy
如果有定义参数的命名路由,可以把参数作为 route 函数的第二个参数传入,指定的参数将会自动插入到 URL 中对应的位置:
Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1]);Copy
如果在数组中传递其他参数,这些键或值对将自动添加到生成的 URL 查询字符串中:
Route::get('/user/{id}/profile', function ($id) {
//
})->name('profile');
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
// /user/1/profile?photos=yes
7. 路由组
路由组允许你共享路由属性,例如中间件,这样不需要在每个单独的路由上定义那些属性。
嵌套组会尝试智能的 “合并” 他们的父组的属性。中间件和 “where” 条件会被合并,而名称和前缀会被追加。URI 前缀中的名称空间分隔符和斜杠会在适当的地方自动添加。
7.1 中间件
想把 中间件 分配给组内所有的路由,你可以在定义组之前使用 middleware 方法。中间件将按照它们在数组中列出的顺序执行:
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// Uses first & second middleware...
});
Route::get('/user/profile', function () {
// Uses first & second middleware...
});
});
路由缓存
# 生成路由缓存
php artisan route:cache
# 清除路由缓存
php artisan route:clear