ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 路由器 ### 基本路由 虽然为[后端控制器](https://octobercms.com/docs/backend/controllers-ajax)自动处理路由,并且CMS页面在其[页面配置中](https://octobercms.com/docs/cms/pages#configuration)定义了自己的URL路由,但路由器服务主要用于定义固定的API和端点。 您可以通过在与[插件注册文件](https://octobercms.com/docs/plugin/registration)相同的目录中创建一个名为**route.php**的文件来定义这些路由。最基本的路由只接受URI和:[](https://octobercms.com/docs/plugin/registration)`Closure` ~~~ Route::get('/', function () { return 'Hello World'; }); Route::post('foo/bar', function () { return 'Hello World'; }); Route::put('foo/bar', function () { // }); Route::delete('foo/bar', function () { // }); ~~~ #### 注册多个动词的路线 有时您可能需要注册一个响应多个HTTP动词的路由。您可以使用立面上的`match`方法来这样做`Route`: ~~~ Route::match(['get', 'post'], '/', function () { return 'Hello World'; }); ~~~ 您甚至可以使用以下`any`方法注册一个响应所有HTTP动词的路由: ~~~ Route::any('foo', function () { return 'Hello World'; }); ~~~ #### 生成路由的URL 您可以使用`Url`立面生成指向路线的URL: ~~~ $url = Url::to('foo'); ~~~ ### [](https://octobercms.com/docs/services/router#route-parameters)路线参数 ### [](https://octobercms.com/docs/services/router#required-parameters)必要参数 有时您需要捕获路由内的URI段,例如,您可能需要从URL中捕获用户的ID。您可以通过定义路由参数来做到这一点: ~~~ Route::get('user/{id}', function ($id) { return 'User '.$id; }); ~~~ 您可以根据自己的路线定义任意多个路线参数: ~~~ Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // }); ~~~ 路线参数始终放在单个*大括号内*。`Closure`执行路线时,参数将传递到您的路线中。 > **注意:**路由参数不能包含`-`字符。请改用下划线(`_`)。 ### [](https://octobercms.com/docs/services/router#parameters-optional-parameters)可选参数 有时,您可能需要指定一个路由参数,但使该路由参数的出现为可选。您可以通过`?`在参数名称后放置一个标记来做到这一点: ~~~ Route::get('user/{name?}', function ($name = null) { return $name; }); Route::get('user/{name?}', function ($name = 'John') { return $name; }); ~~~ ### [](https://octobercms.com/docs/services/router#parameters-regular-expression-constraints)正则表达式约束 您可以`where`在路由实例上使用方法来限制路由参数的格式。该`where`方法接受参数名称和正则表达式,该正则表达式定义应如何约束参数: ~~~ Route::get('user/{name}', function ($name) { // })->where('name', '[A-Za-z]+'); Route::get('user/{id}', function ($id) { // })->where('id', '[0-9]+'); Route::get('user/{id}/{name}', function ($id, $name) { // })->where(['id' => '[0-9]+', 'name' => '[a-z]+']); ~~~ ### [](https://octobercms.com/docs/services/router#named-routes)命名路线 命名路由使您可以方便地生成URL或特定路由的重定向。`as`定义路由时,可以使用数组键为路由指定名称: ~~~ Route::get('user/profile', ['as' => 'profile', function () { // }]); ~~~ #### 路线组和命名路线 如果您使用的是[路由组](https://octobercms.com/docs/services/router#route-groups),则可以`as`在路由组属性数组中指定一个关键字,从而可以为该组内的所有路由设置通用的路由名称前缀: ~~~ Route::group(['as' => 'admin::'], function () { Route::get('dashboard', ['as' => 'dashboard', function () { // Route named "admin::dashboard" }]); }); ~~~ #### 生成命名路由的URL 为给定路由分配名称后,可以在生成URL或通过`Url::route`方法重定向时使用路由名称: ~~~ $url = Url::route('profile'); $redirect = Response::redirect()->route('profile'); ~~~ 如果路由定义了参数,则可以将参数作为第二个参数传递给`route`方法。给定的参数将自动插入URL: ~~~ Route::get('user/{id}/profile', ['as' => 'profile', function ($id) { // }]); $url = Url::route('profile', ['id' => 1]); ~~~ ### [](https://octobercms.com/docs/services/router#route-groups)路线组 路由组使您可以在大量路由之间共享路由属性,而无需在每个单独的路由上定义那些属性。共享属性以数组格式指定为方法的第一个参数`Route::group`。 ### [](https://octobercms.com/docs/services/router#route-group-sub-domain-routing)子域路由 路由组也可以用于路由通配符子域。可以为子域分配路由参数,就像路由URI一样,允许您捕获子域的一部分以在路由或控制器中使用。可以使用`domain`组属性数组上的键来指定子域: ~~~ Route::group(['domain' => '{account}.example.com'], function () { Route::get('user/{id}', function ($account, $id) { // }); }); ~~~ ### [](https://octobercms.com/docs/services/router#route-group-prefixes)路由前缀 该`prefix`组阵列属性可被用于前缀与给定URI的组中的每个路由。例如,您可能想在组内的所有路由URI前面加上`admin`: ~~~ Route::group(['prefix' => 'admin'], function () { Route::get('users', function () { // Matches The "/admin/users" URL }); }); ~~~ 您还可以使用`prefix`参数为分组的路由指定通用参数: ~~~ Route::group(['prefix' => 'accounts/{account_id}'], function () { Route::get('detail', function ($account_id) { // Matches The accounts/{account_id}/detail URL }); }); ~~~ ### [](https://octobercms.com/docs/services/router#route-middleware)路由中间件 在插件的`boot()`方法中注册中间件将针对每个请求在全局范围内注册它。如果您想一次将中间件注册到一个路由,则应这样做: ~~~ Route::get('info', 'Acme\News@info')->middleware('Path\To\Your\Middleware'); ~~~ 对于路由组,可以这样进行: ~~~ Route::group(['middleware' => 'Path\To\Your\Middleware'], function() { Route::get('info', 'Acme\News@info'); }); ~~~ 最后,如果要将一组中间件分配给一个路由,可以这样 ~~~ Route::middleware(['Path\To\Your\Middleware'])->group(function() { Route::get('info', 'Acme\News@info'); }); ~~~ 当然,您可以在一个组中添加多个中间件,为方便起见,在上述示例中仅使用了一个。 ### [](https://octobercms.com/docs/services/router#throwing-404-errors)引发404错误 有两种方法可以从路由手动触发404错误。首先,您可以使用`abort`助手。该`abort`助手简单地抛出一个`Symfony\Component\HttpFoundation\Exception\HttpException`具有指定状态代码: ~~~ App::abort(404); ~~~ 其次,您可以手动抛出的实例`Symfony\Component\HttpKernel\Exception\NotFoundHttpException`。 有关处理404异常以及对这些错误使用自定义响应的更多信息,可以在文档的“[错误和日志记录”](https://octobercms.com/docs/services/error-log)部分中找到。