路由
# 基本路由
虽然为 后端控制器 自动处理路由,但 CMS 页面在其 页面配置 中定义了自己的 URL 路由, 路由器服务主要用于定义固定的 API 和端点。
您可以通过在与 插件注册文件 相同的目录中创建一个名为 routes.php 的文件来定义这些路由。 最基本的路由只接受一个 URI 和一个闭包
:
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 动态的路由。 你可以使用 Route
门面上的 match
方法来做到这一点:
Route::match(['get', 'post'], '/', function () {
return 'Hello World';
});
您甚至可以使用 any
方法注册响应所有 HTTP 动态的路由:
Route::any('foo', function () {
return 'Hello World';
});
# 生成路由的 URL
你可以使用 Url
门面为你的路由生成 URL:
$url = Url::to('foo');
# 路由参数
# 必需参数
有时您需要在路由中捕获 URI 的片段,例如,您可能需要从 URL 中捕获用户的 ID。 您可以通过定义路由参数来做到这一点:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
您可以根据路由的需要定义任意数量的路由参数:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
路由参数始终包含在单个大括号中。 执行路由时,参数将被传递到路由器的闭包
中。
注意:路由参数不能包含
-
字符。 请改用下划线 (_
)。
# 可选参数
有时您可能需要指定一个路由参数,但该路由参数的存在是可选的。 您可以通过在参数名称后放置一个 ?
标记来做到这一点:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
# 正则表达式约束
您可以使用路由实例上的 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]+']);
# 命名路由
命名路由允许您为特定路由方便地生成 URL 或重定向。 在定义路由时,您可以使用 as
数组键为路由指定名称:
Route::get('user/profile', ['as' => 'profile', function () {
//
}]);
# 路由分组和命名路由
如果您使用 路由分组,您可以在路由组属性数组中指定一个 as
关键字,允许您为组内的所有路由设置一个通用的路由名称前缀:
Route::group(['as' => 'admin::'], function () {
Route::get('dashboard', ['as' => 'dashboard', function () {
// Route named "admin::dashboard"
}]);
});
# 生成命名路由的 URL
为给定路由指定名称后,您可以在通过 Url::route
方法生成 URL 或重定向时使用路由名称:
$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]);
# 路由组
路由组允许您在大量路由之间共享路由属性,而无需在每个单独的路由上定义这些属性。 共享属性以数组格式指定为 Route::group
方法的第一个参数。
# 子域路由
路由组也可用于路由通配符子域。 子域可以像路由 URI 一样被分配路由参数,允许您捕获子域的一部分以在路由或控制器中使用。 可以使用组属性数组上的 domain
键指定子域:
Route::group(['domain' => '{account}.example.com'], function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
# 路由前缀
prefix
组数组属性可用于为组中的每个路由添加给定 URI 的前缀。 例如,您可能希望在组内的所有路由 URI 前加上 admin
:
Route::group(['prefix' => 'admin'], function () {
Route::get('users', function () {
// " 匹配"/admin/users" URL
});
});
您还可以使用 prefix
参数为分组路由指定常用参数:
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($account_id) {
// 匹配 accounts/{account_id}/detail URL
});
});
# 路由中间件
在插件的 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');
});
当然,您可以在一个组中添加多个中间件,为方便起见,在上面的示例中只使用了一个。
# 抛出 404 错误
有两种方法可以从路由中手动触发 404 错误。 首先,您可以使用 abort
助手。 abort
助手简单地抛出一个带有指定状态码的 Symfony\Component\HttpFoundation\Exception\HttpException
:
App::abort(404);
其次,你可以手动抛出一个 Symfony\Component\HttpKernel\Exception\NotFoundHttpException
的实例。
有关处理 404 异常和对这些错误使用自定义响应的更多信息,请参阅文档的 错误和日志 部分。