前言:之前在学习并使用 Laravel 框架过程中,全是碎片化掌握,现在重新学习并记录一次学习的过程。

本文内容对应 Laravel8.* 版本。

直达入口:

  • Laravel 框架专栏
  • Laravel 框架官网

本文目录

    • @[toc](本文目录)
  • 一、介绍
    • 1.1 基本路由
    • 1.2 重定向路由
    • 1.3 视图路由
    • 1.4 控制器路由
  • 二、路由参数
    • 2.1 必填参数
    • 2.2 可选参数
    • 2.3 正则表达式约束
    • 2.4 全局约束
  • 三、路由命名
    • 3.1 命名
    • 3.2 生成指定路由 URL
    • 3.3 检查是否命中路由
  • 四、路由组
    • 4.1 中间件
    • 4.2 子域名路由
    • 4.3 路由前缀
    • 4.4 路由名称前缀
  • 五、路由与模型绑定
    • 5.1 隐式绑定
    • 5.2 自定义匹配键名
    • 5.3 显示绑定
    • 5.4 自定义解析逻辑
  • 六、回退路由
  • 七、限流
    • 7.1 定义限流
    • 7.2 路由器分配限流
  • 八、表单方法伪造
  • 九、访问当前路由

一、介绍

本文内容根据 Laravel 官网路由模块学习。

Laravel 框架的所有默认路由文件都保存在 routes 目录中。

  • routes 目录

    • api.php api 路由
    • channels.php 验证配置文件
    • console.php 广播事件配置文件
    • web.php 定义 web 页面路由

1.1 基本路由

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::push($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);Route::match(['get', 'post'], '/', function(){# 处理多种请求类型的路由
});
Route::any('/', function(){# 处理所有请求类型的路由
});

1.2 重定向路由

Route::redirect('/here', '/there');          # 重定向路由
Route::redirect('/here', '/there', 301);        # 重定向路由,默认返回状态码为 302
Route::permanentRedirect('/here', '/there');    # 重定向路由,默认使用 301 状态码返回

1.3 视图路由

# 第一个参数为 URI,第二个参数对应 resources/views 目录中的模板文件名
Route::view('/welcome', 'welcome');

1.4 控制器路由

use App\Http\Controllers\WelcomeController;# 第一个参数为 URI,第二个参数对应控制器,会调用控制器 中的 show 方法
Route::get('/welcome', [WelcomeController::class, 'show']);

二、路由参数

2.1 必填参数

# 使用 {} 括起来的参数为必填参数, 参数名不能包含 - /
Route::get('goods_detail/{id}', $callback);

2.2 可选参数

# 使用 {参数名?} 格式的为可选参数,参数名不能包含 - /
Route::get('goods_detail/{id}/top/{is_top?}', $callback);

2.3 正则表达式约束

在路由定义上链式调用 where 方法中来约束路由参数的格式。

# 单个约束
Route::get('goods_detail/{id}', $callback)->where('id', '[0-9]+');# 数组格式约束多个
Route::get('user_detail/{id}/{name}', $callback)->where(['id'=>'[0-9]+', 'name'=>'[a-z]+']);# 字符过滤,Laravel 允许除 / 之外的所有字符,可使用正则表达式显式的允许成为占位符的一部分
Route::get('search/{string}', $callback)->where('string', '.*');# 常用的辅助正则表达式模式
Route::get('user_detail/{id}/{name}', $callback)->whereNumber('id')->whereAlpha('name');# whereAlpha()、whereAlphaNumeric()、whereNumber()、whereUuid()、assignExpressionToParameters($parameters, $expression)

2.4 全局约束

如果你希望某个参数在每个路由当中都遵循同一个正则表达式约束,则使用 Route::pattern() 方法在 RouteServiceProvider文件 的 boot 方法中定义约束。

# app/Providers/RouteServiceProvider.php 文件
public function boot()
{Route::pattern('id', '[0-9]+');
}

三、路由命名

在路由定义上链式调用 name 方法中为路由生成名称,路由名称是唯一的。

3.1 命名

# 闭包函数命名
Route::get('goods_detail/{id}', $callback)->name('goods_detail');# 指定控制器行为命名
Route::get('goods_detail/', [GoodsController::class, 'show'])->name('goods_detail');

3.2 生成指定路由 URL

# 生成链接
$url = route('goods_detail');# 生成带参数的链接
$url = route('goods_detail', ['id'=>1]);# 生成重定向
return redirect()->route('goods_detail');

3.3 检查是否命中路由

如果你想判断当前请求是否指向某个命名过的路由,可链式调用 named 方法来判断。

if ($request->route()->named('goods_detail')){}

四、路由组

路由组允许在大量路由之间共享路由属性,例如中间件、子域名、前缀等。

4.1 中间件

Route::middleware(['first', 'second'])->group(function(){Route::get('/', function(){# 使用 first 和 second 中间件});Route::get('goods_detail/{id}', function(){# 使用 first 和 second 中间件});
});

4.2 子域名路由

# 应在注册根域名路由前注册子域名路由。
Route::domain('{account}.myapp.com')->group(function () {Route::get('user/{id}', function ($account, $id) {//});
});

4.3 路由前缀

prefix() 方法将会为路由组中的每个路由的 URI 添加前缀。

Route::prefix('admin')->group(function(){Route::get('users', function(){# 访问的URL是 /admin/users});
});

4.4 路由名称前缀

链式调用name 方法可为路由组中的每个路由添加指定的名称前缀。注意:确保前缀中包含 . 字符。

Route::name('admin.')->group(function(){Route::get('users', function(){# 最终定义的路由名称是 admin.users})->name('users');
});

五、路由与模型绑定

5.1 隐式绑定

在这个例子当中, $user 类型提示为 App\Models\User Eloquent 模型,变量名 $user 与 URI 中的 {user} 相匹配,因此 Laravel 会自动注入与请求 URI 中传入的 ID 匹配的用户模型实例。

如果在数据库中未找到对应的模型实例,则自动生成 404 异常。

# 闭包路由写法
Route::get('api/users/{user}', function(App\Models\User $user){return $user->email;
});# 控制器写法
Route::get('users/{user}', [UserController::class, 'show']);# 控制器代码
use App\Http\Controllers\UserController;
use App\Models\User;public function show(User $user)
{return view('user.profile', ['user' => $user]);
}

5.2 自定义匹配键名

默认使用 id 键名来解析 Eloquent 模型,可自定义键名。

use App\Models\Post;
use App\Models\User;# 限定 $post 通过 slug 字段来检索
Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {return $post;
});

如果希望模型绑定在检索给定的模型类时,默认使用 id 以外的数据库字段,可重写 Eloquent 模型上的 getRouteKeyName 方法。

/*** 获取该模型的路由的自定义键名** @return string*/
public function getRouteKeyName()
{return 'slug';
}

5.3 显示绑定

要注册显示绑定,使用路由器的 model 方法,绑定参数指定的类。在 app/Providers/RouteServiceProvider.php 文件类的 boot 方法定义显示的绑定。

/*** 定义你的路由模型绑定, pattern 过滤器等** @return void*/
public function boot()
{Route::model('user', \App\Models\User::class);// ...
}

绑定好后,就可以使用了。

# 上边已将 user 参数绑定给了 \App\Models\User 模型,所以 $user 会被注入该路由
Route::get('profile/{user}', function (App\Models\User $user) {//
});

5.4 自定义解析逻辑

第一种: 在 app/Providers/RouteServiceProvider.php 文件类的 boot 方法中使用 Route::bind 方法自定义。

/*** 定义你的路由模型绑定, pattern 过滤器等** @return void*/
public function boot()
{Route::bind('user', function ($value) {return App\Models\User::where('name', $value)->firstOrFail();});// ...
}

第二种:重写 Eloquent 模型上的 resolveRouteBinding 方法。

/*** 检查绑定值的模型** @param  mixed  $value* @param  string|null  $field* @return \Illuminate\Database\Eloquent\Model|null*/
public function resolveRouteBinding($value, $field = null)
{return $this->where('name', $value)->firstOrFail();
}

六、回退路由

回退路由是指 没有命中其他路由的情况下才执行的路由。

注意:回退路由应始终是您应用程序注册的最后一个路由。

Route::fallback(function(){#
});

七、限流

限注顾名思义就是限制流量的请求次数,在 app/Providers/RouteServiceProvider.php 文件中定义限流器。

使用 RateLimiter 门面的 for 方法定义。for 方法接受「速率限制器名称」和「闭包返回限制配置」。

具体更多限制时段方法 查看 Illuminate\Cache\RateLimiting\Limit;

7.1 定义限流

# app/Providers/RouteServiceProvider.php 文件# 1. 默认响应 429 状态码
RateLimiter::for('global', function (Request $request) {return Limit::perMinute(1000);
});# 2. 自定义响应内容,使用 response 方法
RateLimiter::for('global', function (Request $request) {return Limit::perMinute(1000)->response(function () {return response('Custom response...', 429);});
});# 3. 可用 $request 实例调取参数,VIP 无限制,不是 VIP 则按身份验证请求频率
RateLimiter::for('uploads', function (Request $request) {return $request->user()->vipCustomer()? Limit::none(): Limit::perMinute(100);
});# 4. 范围频率限制
RateLimiter::for('uploads', function (Request $request) {return $request->user()->vipCustomer()? Limit::none(): Limit::perMinute(100)->by($request->ip());
});# 5. 多个频率限制
RateLimiter::for('login', function (Request $request) {return [Limit::perMinute(500),Limit::perMinute(3)->by($request->input('email')),];
});

7.2 路由器分配限流

使用 throttle 关键字将配置好的频率限制器名称放到中间件 middleware 数组中。

Route::middleware(['throttle:uploads'])->group(function () {Route::post('/audio', function () {//});Route::post('/video', function () {//});
});

八、表单方法伪造

Html 表单不支持 putpatchdelete 请求,但可以在 form 表单中添加 _method 隐藏域来实现以上请求。

<form action="/foo/bar" method="POST"><input type="hidden" name="_method" value="PUT"><input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>// 或<form action="/foo/bar" method="POST">@method('PUT')@csrf
</form>

九、访问当前路由

$route = Route::current();$name = Route::currentRouteName();$action = Route::currentRouteAction();

【PHP框架 | Laravel8 系列3】 - 路由相关推荐

  1. 【PHP框架 | Laravel8 系列4】 - Artisan 命令行

    前言:之前在学习并使用 Laravel 框架过程中,全是碎片化掌握,现在重新学习并记录一次学习的过程. 本文内容对应 Laravel8.* 版本. 直达入口: Laravel 框架专栏 Laravel ...

  2. 【PHP框架 | Laravel8 系列5】 - 视图与CSRF保护

    前言:之前在学习并使用 Laravel 框架过程中,全是碎片化掌握,现在重新学习并记录一次学习的过程. 本文内容对应 Laravel8.* 版本. Laravel 直达入口: Laravel 框架专栏 ...

  3. 【PHP框架 | Laravel8 系列1】 - Composer 安装指定 Laravel 版本

    前言:之前在学习并使用 Laravel 框架过程中,全是碎片化掌握,现在重新学习并记录一次学习的过程. 本文内容所对应 Laravel8.* 版本. 一. 安装 Composer 第一种: Compo ...

  4. .NetCore框架Surging系列(六)路由发现

    .NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 .NetCore框架Sur ...

  5. .NetCore框架Surging系列(三)HTTP本地路由发现过程

    .NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 .NetCore框架Sur ...

  6. .NetCore框架Surging系列(一)介绍

    .NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 这里写自定义目录标题 Su ...

  7. go开源文件服务器框架,golang微服务框架go-zero系列-4:go-zero文件服务

    golang微服务框架go-zero系列-4:go-zero文件服务 go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于 不写任何一个和文件相关的handler 如果 ...

  8. .NetCore框架Surging系列(九)性能提升-1

    .NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 .NetCore框架Sur ...

  9. .NetCore框架Surging系列(二)HTTP

    .NetCore框架Surging系列(一)介绍 .NetCore框架Surging系列(二)HTTP .NetCore框架Surging系列(三)HTTP本地路由发现过程 Surging系列(二)H ...

最新文章

  1. python画图程序飞机_Python海龟画图工具绘制叮当猫程序
  2. 计算机视觉四大基本任务(分类、定位、检测、分割)
  3. java 分布式事务 mq_ActiveMQ分布式事务
  4. 政、企、学三方视角下的智慧城市发展 | 2020中关村论坛“人工智能与城市可持续发展论坛”成功举办...
  5. 趣链 BitXHub跨链平台 (5)跨链网关-子模块
  6. 决策树可视化,被惊艳到了!
  7. 企业如何用CRM软件客户管理自动化优化流程?
  8. 怎么写计算机教学论文,如何写好一篇关于信息技术教育的论文
  9. 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)
  10. 生成二维码并以图片格式下载-qrcodejs2
  11. Struts2标签库(三)之表单标签
  12. mysql io线程 原理_mysql 原理 ~ 线程与IO
  13. Js中Array数组学习总结
  14. python 代码格式_python代码格式
  15. 以半桥驱动芯片FAN73933为例说明自举原理
  16. 【Redis】Redis配置文件详解
  17. 十、网络编程(高琪java300集+java从入门到精通笔记)
  18. [codevs1746][NOI2002] 贪吃的九头龙 树形DP
  19. 2020工商银行信息技术岗校招笔试经历
  20. 什么是机器学习,为什么它如此重要?

热门文章

  1. 零基础入门测试该学什么?最全整理,照着学就对了
  2. 第1090期AI100_机器学习日报(2017-09-12)
  3. CUDA CUBIN/PTX文件动态加载
  4. Arduino + Lcd1602 显示当前环境温度
  5. html5如何设置字号,如何设置css中字体大小?
  6. LSTM长短期记忆模型
  7. java计算机毕业设计追星网站源码+数据库+系统+lw文档
  8. KDevelop详细Debug教程
  9. 后台管理系统日志(一个小插曲)
  10. 宋朝名画“虎戴VR”,在外网火了