# 路由组
## 路由组
<https://www.cnblogs.com/wesky/p/10443206.html>
- 路由组允许你在大量路由之间共享路由属性,例如中间件或命名空间,而不需要为每个路由单独定义这些属性。
- 共享属性应该以数组的形式传入 `Route::group` 方法的第一个参数中。
### 中间件
要给路由组中所有的路由分配中间件,可以在 group 之前调用`middleware`方法,中间件会依照它们在数组中列出的顺序来运行:
```
<pre class="calibre11">```
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// // 使用 first 和 second 中间件
});
Route::get('user/profile', function () {
// // 使用 first 和 second 中间件
});
});
```
```
### 命名空间
另一个常见用例是使用`namespace`方法将相同的 PHP 命名空间分配给路由组的中所有的控制器:
```
<pre class="calibre11">```
Route::namespace('Admin')->group(function () {
// 在 "App\Http\Controllers\Admin" 命名空间下的控制器
});
```
```
### 子域名路由
- 子域名可以像路由 URI 一样被分配路由参数,允许你获取一部分子域名作为参数给路由或控制器使用。
- 可以在 group 之前调用`domain`方法来指定子域名:
```
<pre class="calibre11">```
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
```
```
### 路由前缀
可以用`prefix`方法为路由组中给定的 URL 增加前缀。例如,你可以为组中所有路由的 URI 加上 admin 前缀:
```
<pre class="calibre11">```
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// 匹配包含 "/admin/users" 的 URL
});
});
```
```
### 路由名称前缀
name 方法可以用来给路由组中的每个路由名称添加一个给定的字符串。 例如,您可能希望以 「admin」为所有分组路由的名称加前缀。 给定的字符串与指定的路由名称前缀完全相同,因此我们将确保在前缀中提供尾部的`.`字符:
```
<pre class="calibre11">```
Route::name('admin.')->group(function () {
Route::get('users', function () {
// 指定路由名为 "admin.users"...
})->name('users');});
```
```
## 路由模型绑定
- 当向路由或控制器行为注入模型 ID 时,就需要查询这个 ID 对应的模型。
- 例如,你可以注入与给定 ID 匹配的整个`User`模型实例,而不是注入用户的 ID。
### 隐式绑定
Laravel 会自动解析定义在路由或控制器行为中与类型提示的变量名匹配的路由段名称的 Eloquent 模型。例如:
```
<pre class="calibre11">```
Route::get('api/users/{user}', function (App\User $user) {
return $user->email;
});
```
```
在这个例子中,由于`$user`变量被类型提示为 Eloquent 模型`App\User`,变量名称又与 URI 中的`{user}`匹配,因此,Laravel 会自动注入与请求 URI 中传入的 ID 匹配的用户模型实例。如果在数据库中找不到对应的模型实例,将会自动生成 404 异常。
#### 自定义键名
如果你想要模型绑定在检索给定的模型类时使用除`id`之外的数据库字段,你可以在 Eloquent 模型上重写`getRouteKeyName`方法:
```
<pre class="calibre11">```
/**
* 获取该模型的路由的自定义键名。
*
* @return string
*/
public function getRouteKeyName(){
return 'slug';
}
```
```
### 显式绑定
要注册显式绑定,使用路由器的`model`方法来为给定参数指定类。在`RouteServiceProvider`类中的`boot`方法内定义这些显式模型绑定:
```
<pre class="calibre11">```
public function boot(){
parent::boot();
Route::model('user', App\User::class);
}
```
```
接着,定义一个包含`{user}`参数的路由:
```
<pre class="calibre11">```
Route::get('profile/{user}', function (App\User $user) {
//
});
```
```
因为我们已经将所有`{user}`参数绑定至`App\User`模型,所以`User`实例将被注入该路由。例如,`profile/1`的请求会注入数据库中 ID 为 1 的`User`实例。
如果在数据库中找不到匹配的模型实例,就会自动抛出一个 404 异常。
#### 自定义逻辑解析
如果你想要使用自定义的解析逻辑,就使用`Route::bind`方法。传递到`bind`方法的`闭包`会接受 URI 中大括号对应的值,并且返回你想要在该路由中注入的类的实例:
```
<pre class="calibre11">```
/**
* 启动应用服务。
*
* @return void
*/
public function boot(){
parent::boot();
Route::bind('user', function ($value) {
return App\User::where('name', $value)->first() ?? abort(404);
});
}
```
```
或者,您可以重写 Eloquent 模型上的`resolveRouteBinding`方法。 此方法会接受 URI 中大括号对应的值,并且返回你想要在该路由中注入的类的实例:
```
<pre class="calibre11">```
/**
* 检索绑定值的模型。
*
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function resolveRouteBinding($value){
return $this->where('name', $value)->first() ?? abort(404);
}
```
```
## 回退路由
使用`Route::fallback`方法, 你可以定义在没有其他路由匹配传入请求时执行的路由。通常,未处理的请求会通过应用程序的异常处理程序自动呈现 “404” 页面。 但是,因为你可以在`routes/web.php`文件中定义`fallback`路由,`web`中间件的所有中间件都将应用到路由中。 当然,你也可以根据需要向这条路由中添加额外的中间件:
```
<pre class="calibre11">```
Route::fallback(function () {
//
});
```
```
> {note} 回退路由应始终是你应用程序注册的最后一个路由。
## 访问控制
Laravel 包含了一个 middleware 用于控制应用程序对路由的访问。 如果想要使用, 请将`throttle`中间件分配给一个路由或者一个路由组。`throttle`中间件会接收两个参数,这两个参数决定了在给定的分钟数内可以进行的最大请求数。例如,让我们指定一个经过身份验证并且用户每分钟访问频率不超过 60 次的路由组:
```
<pre class="calibre11">```
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::get('/user', function () {
//
});
});
```
```
#### 动态访问控制
你可以根据已验证的`User`模型的属性,指定动态请求的最大值。例如,如果你的`User`模型包含`rate_limit`属性,则可以将属性名称传递给`throttle`中间件,以便它用于计算最大请求数:
```
<pre class="calibre11">```
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::get('/user', function () {
//
});
});
```
```
## 表单方法伪造
HTML 表单不支持`PUT`、`PATCH`或`DELETE`行为。所以当你要从 HTML 表单中调用定义了`PUT`、`PATCH`或`DELETE`行为的路由时,你将需要在表单中增加一个隐藏的`_method`输入标签。使用`_method`字段的值作为 HTTP 的请求方法:
```
<pre class="calibre11">```
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
```
```
你也可以使用`@method`模板指令生成`_method`输入:
```
<pre class="calibre11">```
<form action="/foo/bar" method="POST">
@method('PUT')
@csrf
</form>
```
```
## 访问当前路由
你可以使用 Route facade 上的`current`、`currentRouteName`和`currentRouteAction`方法来访问处理传入请求的路由的信息:
```
<pre class="calibre11">```
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();
```
```
如果你想知道所有可访问的方法,可以查看 API 文档,了解 Route facade 和 Route 实例 的基础类。
- 基本说明
- 基本操作
- October cms 安装
- 后台控制器路径
- 图标
- 获取安装网上的插件/主题
- 插件构造器使用
- 定时任务
- October后台控制器
- vscode编辑器
- ajax操作
- 使用
- ajax更新组件
- ajax属性API
- JavaScript API
- ajax综合使用
- 主题
- 多语言主题
- 安装市场主题
- 主题程序处理
- 主题
- 页面
- 部件
- 布局
- 内容
- 组件
- 媒体
- 主题表单操作
- 表单使用
- 表单后端程序处理
- 插件
- 自定义插件
- 插件说明
- 插件导航条
- 插件数据库设置
- 插件的设置管理
- 插件的配置文件config
- 组件
- app服务
- app容器
- 扩展行为
- 缓存
- Collection类
- Lazy Collections
- Collection方法
- 助手函数
- 数组助手函数
- 路径助手函数
- 玄乐助手函数
- 其他助手函数
- 错误与记录
- 事件处理
- HTML页面
- 文件与目录操作
- 散列和加密
- 邮件
- 邮件内容
- 邮件发送
- 分页
- 模板解析器
- 动态解析器语法
- 队列消息
- 请求与输入
- 响应
- 视图
- 路由器
- 配置
- 验证操作
- 处理错误消息
- 错误消息与视图
- 可用的验证规则
- 有条件的验证规则
- 验证数组
- 错误消息
- 自定义验证规则
- 模型操作
- 定义模型与其属性
- 检索模型
- 插入与更新
- 删除模型
- 查询范围
- 事件操作
- 关联操作
- 定义关系
- 关系类型
- 多肽关系
- 关系查询
- 渴望加载
- 插入模型
- 数据库操作
- 基本用法
- 数据表结构
- 查询连贯操作
- 结果检索
- select子句
- 插入更新
- where子句
- 排序,分组,限制和偏移
- 文件附件
- Collection操作
- 属性操作
- 系列化json
- 数据库属性
- 数据库行为
- 控制器
- 后台控制器定义
- 后台页面
- 后台组件
- 后台表单
- 表单组件
- 表单视图
- 表单行为
- 后台列表
- 列表行为
- 列表过滤器
- 可用列类型
- 关系行为
- 关系行为类型
- 扩展关系行为
- 列表排序操作
- 导入导出操作
- 用于与权限
- corlate模板修改
- 修改顶部导航
- laravel问题
- 控制器不存在
- 控制器
- 路由组
- laravel笔记
- laravel 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图