{"./":{"url":"./","title":"Laravel","keywords":"","body":"Laravel Laravel 是一套简洁、优雅的 PHP Web 开发框架。 "},"docs/基础功能.html":{"url":"docs/基础功能.html","title":"基础功能","keywords":"","body":"基础功能 "},"docs/基础功能/路由.html":{"url":"docs/基础功能/路由.html","title":"路由","keywords":"","body":"路由 基本路由 路由控制器绑定 路由方法 CSRF 保护 重定向路由 视图路由 必选参数 可选参数 正则约束 全局约束 编码正斜杠 命名路由 路由分组 中间件 命名空间 子域名路由 路由前缀 命名路由前缀 隐式绑定 显式绑定 回退路由 访问控制 表单方法伪造 访问当前路由 基本路由 构建基本的路由只需要一个 URI 与一个闭包，这里提供了一个非常简单优雅定义路由的方法。 路由控制器绑定 对于稍微复杂一些的业务逻辑，你可以将其拆分到控制器方法中实现，然后在定义路由的时候使用控制器和方法名来取代闭包函数。 路由方法 你可以注册路由来响应任何 HTTP 请求。 有时候需要注册一个路由响应多种 HTTP 请求，这可以通过下面的方法来实现。 或者使用下面的方法注册一个路由来响应所有 HTTP 请求。 CSRF 保护 在路由文件中，所有请求方式为 POST 、 PUT 或 DELETE 的路由对应的 HTML 表单都必须包含一个 _token 令牌字段，否则，请求会被拒绝。 @csrf 重定向路由 如果你需要定义一个重定向到其他 URI 的路由，可以使用下面的方法。 默认情况下，上面的方法返回 302 状态码，你可以使用可选的第三个参数来自定义这个状态码。 你还可以使用下面的方法来返回 301 状态码。 视图路由 如果你的路由需要返回一个视图，可以使用下面的方法。 此外，你还可以提供一个数组数据传递到该视图方法作为可选的第三个参数，该数组数据可用于视图中的数据渲染。 'laravel' ]); 必选参数 有时你需要在路由中获取 URI 请求参数，可以通过如下方式定义路由参数。 也可以根据需要在路由中定义多个路由参数。 可选参数 有时你需要指定一个路由参数，但你希望这个参数是可选的。 正则约束 你可以通过使用下面的方法来约束路由参数的格式。 where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { return $id . '-' . $name; })->where([ 'id' => '[0-9]+', 'name' => '[a-zA-Z]+' ]); 全局约束 如果想要路由参数在全局范围内被给定正则表达式约束，需要在 RouteServiceProvider 类的 boot() 方法中定义这种约束模式。 /** * Define your route model bindings, pattern filters, etc. * * @param void * @return void */ public function boot() { Route::pattern('id', '[0-9]+'); parent::boot(); } 一旦模式被定义，将会自动应用到所有包含该参数名的路由中。 编码正斜杠 路由组件支持除正斜杠之外的所有字符，如果要在占位符中使用正斜杠需要通过下面的方式允许。注意，只有最后一个路由参数片段中才支持编码正斜杠。 where('content', '.*'); 命名路由 命名路由为生成 URI 或提供了方便，实现起来也很简单。 name('user'); 如果命名路由定义了参数，可以使用下面的方法将给定的路由参数插入到 URI 中。 $id ]); })->name('profile'); 还可以为控制器动作指定路由名称。 name('user'); 如果你想要判断当前请求是否被路由到给定命名路由，可以在控制器中使用下面的方法。 /** * Just a test method. * * @param Request $request * @return void */ public function index(Request $request) { if ($request->route()->named('user')) { } } 路由分组 路由分组的目的是让多个路由共享相同的路由属性，这样的话定义大量的路由时就不必为每一个路由单独定义属性。 中间件 要给某个路由分组中定义的所有路由分配中间件，可以在定义分组之前使用下面的方法。 group(function () { Route::get('/', function () { return 'Hello, World!'; }); Route::get('user/{id}', function ($id) { return $id; }); }); 命名空间 可以使用下面的方法分配同一个 PHP 命名空间给该分组下的多个控制器。 group(function () { Route::get('admin', 'AdminController@index'); }); 子域名路由 路由分组还可以被用于处理子域名路由，子域名可以像 URI 一样被分配给路由参数，从而允许捕获子域名的部分用于路由或者控制器。 group(function () { Route::get('/', function ($domain) { return $domain; }); Route::get('user/{id}', function ($domain, $id) { return $domain . '-' . $id; }); }); 路由前缀 你可以为分组中所有路由 URI 添加给定的前缀。 group(function () { Route::get('/', function () { return route('user'); })->name('user'); Route::get('{id}', function ($id) { return route('profile', [ 'id' => $id ]); })->name('profile'); }); 命名路由前缀 可以使用下面的方法为分组中的每个路由命名前缀。 group(function () { Route::get('user/{id}', function ($id) { return route('user.profile', [ 'id' => $id ]); })->name('profile'); }); 隐式绑定 Laravel 会自动解析定义在路由或控制器动作（变量名匹配路由片段）中的模型类型声明。 email; }); 如果你想要在隐式模型绑定中使用数据表的其它字段作为主键，可以重写模型类的 getRouteKeyName() 方法。 /** * Get the route key for the model. * * @param void * @return string */ public function getRouteKeyName() { return 'name'; } 显式绑定 要注册显式绑定，你需要在 RouteServiceProvider 类的 boot() 方法中定义显式模型绑定。 /** * Define your route model bindings, pattern filters, etc. * * @param void * @return void */ public function boot() { parent::boot(); Route::model('model', \\App\\User::class); } 接着，定义一个包含该参数的路由。 email; }); 如果你想要使用自定义的解析逻辑，可以在 RouteServiceProvider 类的 boot() 方法中使用下面的方法，传递到该方法的闭包会获取到 URI 请求参数中的值，并且返回你想要在该路由中注入的类实例。 /** * Define your route model bindings, pattern filters, etc. * * @param void * @return void */ public function boot() { parent::boot(); Route::bind('model', function ($value) { return \\App\\User::where('id', $value)->first() ?? abort(404); }); } 此外，你还可以在模型类中覆盖 resolveRouteBinding() 方法，这个方法会获取 URI 片段中的值并返回应该被注入的路由模型类实例。 /** * Retrieve the model for a bound value. * * @param mixed $value * @return \\Illuminate\\Database\\Eloquent\\Model|null */ public function resolveRouteBinding($value) { return $this->where('id', $value)->first() ?? abort(404); } 回退路由 使用下面的方法可以定义一个当所有其他路由都未能匹配请求 URI 时所执行的路由。注意，回退路由应该总是放到应用注册的所有路由的最后。 访问控制 Laravel 自带了一个中间件用于限制对应用路由的访问频率，该中间件会接收两个参数，这两个参数决定了在给定的分钟数内可以进行的最大请求数。 group(function () { Route::get('/', function () { return 'Hello, World!'; }); }); 表单方法伪造 HTML 表单不支持 PUT 、 PATCH 或者 DELETE 请求方法，因此，在 HTML 表单中调用 PUT 、 PATCH 或 DELETE 路由时，需要添加一个隐藏的 _method 字段，其值被用作该表单的 HTTP 请求方法。 @method('PUT') @csrf 访问当前路由 你可以使用下面的方法来访问处理当前输入请求的路由信息。 $route = Route::current(); $name = Route::currentRouteName(); $action = Route::currentRouteAction(); "}}