1. 基本使用

1.1 自定义路由文件

laravel8 中如果想要自定义路由文件和laravel级一下版本不一样。

1)routes 文件夹下新增 myWeb.php

  1. <?php
  2. use Illuminate\Support\Facades\Route;
  3. /*
  4. |--------------------------------------------------------------------------
  5. | Web Routes
  6. |--------------------------------------------------------------------------
  7. |
  8. */
  9. Route::get('/hello', function () {
  10. return 'Hello World';
  11. });

2) 路由服务提供者(app/Providers/RouteServiceProvider.php

  1. public function boot()
  2. {
  3. $this->configureRateLimiting();
  4. $this->routes(function () {
  5. Route::prefix('api')
  6. ->middleware('api')
  7. ->namespace($this->namespace)
  8. ->group(base_path('routes/api.php'));
  9. Route::middleware('web')
  10. ->namespace($this->namespace)
  11. ->group(base_path('routes/web.php'));
  12. // 新增:自定义的一个路由文件
  13. Route::middleware('myWeb')
  14. ->namespace($this->namespace)
  15. ->group(base_path('routes/myWeb.php'));
  16. });
  17. }

3)app/Providers/RouteServiceProvider.php 新增 ‘myWeb’ => [] 这一段数组配置

  1. protected $middlewareGroups = [
  2. 'web' => [
  3. \App\Http\Middleware\EncryptCookies::class,
  4. \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  5. \Illuminate\Session\Middleware\StartSession::class,
  6. // \Illuminate\Session\Middleware\AuthenticateSession::class,
  7. \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  8. \App\Http\Middleware\VerifyCsrfToken::class,
  9. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  10. ],
  11. // 新增的
  12. 'myWeb' => [
  13. \App\Http\Middleware\EncryptCookies::class,
  14. \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  15. \Illuminate\Session\Middleware\StartSession::class,
  16. // \Illuminate\Session\Middleware\AuthenticateSession::class,
  17. \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  18. \App\Http\Middleware\VerifyCsrfToken::class,
  19. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  20. ],
  21. 'api' => [
  22. // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
  23. 'throttle:api',
  24. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  25. ],
  26. ];

4)测试:ok
截屏2021-10-08 上午11.41.25.png


1.2 路由基本方法

1.2.1 支持的六种基本路由方法

  1. Route::get('/test_get', fn() => 'test_get');
  2. Route::post('/test_post', fn() => 'test_post');
  3. Route::put('/test_put', fn() => 'test_put');
  4. Route::patch('/test_patch', fn() => 'test_patch');
  5. Route::delete('/test_delete', fn() => 'test_delete');
  6. Route::options('/test_options', fn() => 'test_options');

1.2.2 匹配多种或者匹配任意一种

  1. // match 匹配多个
  2. Route::match(['get', 'post'], '/test_match', fn() => 'match ok');
  3. // any 匹配任意一个
  4. Route::any('/test_any', fn() => 'any ok');

2. 文件路由(路由+控制器)

2.1 基本例子

1)先创建一个控制器 php artisan make:controller User , 然后写入代码

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class User extends Controller
  5. {
  6. // 新增的代码
  7. public function index(): array
  8. {
  9. $arr1 = [4, 5];
  10. return [1, 2, 3, ...$arr1, 6, 7];
  11. }
  12. }

2)路由文件中添加路由

  1. // 路由文件,laravel8 后面的写发用数组代替了
  2. Route::get('/user', [User::class, 'index']);

3)postman:测试结果
截屏2021-10-09 下午2.53.27.png


3. 路由重定向

3.1 redirect 和 permanentRedirect

  1. // 路由重定向
  2. Route::redirect('/here', '/there');
  3. // 默认情况, Route::redirect 返回的状态码是 302 。 但你可以使用第三个可选参数自定义状态码:
  4. Route::redirect('/here', '/there', 301);
  5. // Route::permanentRedirect 方法返回 301 状态码
  6. Route::permanentRedirect('/here', '/there');
  7. Route::get('/there', fn() => 'redirect there');

4. 视图路由


5. 路由参数

5.1 必填参数

路由的参数通常都会被放在 {} ,并且参数名只能为字母。 下划线 (_) 也可以用于路由参数名中。路由参数会按路由定义的顺序依次注入到路由回调或者控制器中 - ,而不受回调或者控制器的参数名称的影响。

  1. // 单个参数
  2. Route::get('/user/{id}', fn($id) => 'User ' . $id);
  3. // 多个参数
  4. Route::get('/posts/{post}/comments/{comment}', fn($postId, $commentId) => $postId . ';' . $commentId);

5.2 可选参数

有时,你可能需要指定一个路由参数,但你希望这个参数是可选的。你可以在参数后面加上 ? 标记来实现,但前提是要确保路由的相应变量有默认值:

  1. Route::get('/user/{name?}', function ($name = null) {
  2. return $name;
  3. });
  4. Route::get('/user/{name?}', function ($name = 'John') {
  5. return $name;
  6. });

5.3 正则表达式约束

你可以使用路由实例上的 where 方法约束路由参数的格式。where 方法接受参数名称和定义参数应如何约束的正则表达式:

  1. Route::get('/user/{name}', function ($name) {
  2. //
  3. })->where('name', '[A-Za-z]+');
  4. Route::get('/user/{id}', function ($id) {
  5. //
  6. })->where('id', '[0-9]+');
  7. Route::get('/user/{id}/{name}', function ($id, $name) {
  8. //
  9. })->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

5.4 参数和依赖注入

如果您的路由具有依赖关系,而您希望 Laravel 服务容器自动注入到路由的回调中,则应在依赖关系之后列出路由参数:

  1. use Illuminate\Http\Request;
  2. Route::get('/user/{id}', function (Request $request, $id) {
  3. return 'User '.$id;
  4. });

[

](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 方法中定义这些:

  1. /**
  2. * 定义你的路由模型绑定, pattern 过滤器等
  3. *
  4. * @return void
  5. */
  6. public function boot()
  7. {
  8. Route::pattern('id', '[0-9]+');
  9. }

6. 路由命名

路由命名可以方便地为指定路由生成 URL 或者重定向。通过在路由定义上链式调用 name 方法可以指定路由名称:
注意:路由命名必须是唯一的

  1. Route::get('/user/profile', function () {
  2. //
  3. })->name('profile');Copy
  4. 你还可以指定控制器行为的路由名称:
  5. Route::get(
  6. '/user/profile',
  7. [UserProfileController::class, 'show']
  8. )->name('profile');Copy

6.1 生成指定路由的 URL

一旦为路由指定了名称,你可以在生成 url 或者通过 Laravel 的 route 和 redirect 辅助函数重定向时使用路由的名字:

  1. // 生成链接...
  2. $url = route('profile');
  3. // 生成重定向...
  4. return redirect()->route('profile');Copy

如果有定义参数的命名路由,可以把参数作为 route 函数的第二个参数传入,指定的参数将会自动插入到 URL 中对应的位置:

  1. Route::get('/user/{id}/profile', function ($id) {
  2. //
  3. })->name('profile');
  4. $url = route('profile', ['id' => 1]);Copy

如果在数组中传递其他参数,这些键或值对将自动添加到生成的 URL 查询字符串中:

  1. Route::get('/user/{id}/profile', function ($id) {
  2. //
  3. })->name('profile');
  4. $url = route('profile', ['id' => 1, 'photos' => 'yes']);
  5. // /user/1/profile?photos=yes

7. 路由组

路由组允许你共享路由属性,例如中间件,这样不需要在每个单独的路由上定义那些属性。
嵌套组会尝试智能的 “合并” 他们的父组的属性。中间件和 “where” 条件会被合并,而名称和前缀会被追加。URI 前缀中的名称空间分隔符和斜杠会在适当的地方自动添加。

7.1 中间件

想把 中间件 分配给组内所有的路由,你可以在定义组之前使用 middleware 方法。中间件将按照它们在数组中列出的顺序执行:

  1. Route::middleware(['first', 'second'])->group(function () {
  2. Route::get('/', function () {
  3. // Uses first & second middleware...
  4. });
  5. Route::get('/user/profile', function () {
  6. // Uses first & second middleware...
  7. });
  8. });

路由缓存

  1. # 生成路由缓存
  2. php artisan route:cache
  3. # 清除路由缓存
  4. php artisan route:clear