多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 路由组 ## 路由组 <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 实例 的基础类。