# 路由器
### 基本路由
虽然为[后端控制器](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)部分中找到。
- 基本说明
- 基本操作
- 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 安装
- 伪静态配置
- 依赖注入 & 控制器
- 中间件
- 路由文件
- 视图