路由器服务
基本路由
虽然路由是自动处理的后端控制器 和 CMS 页面定义了它们自己的 URL 路由页面配置,路由器服务主要用于定义固定的 API 和端点。
您可以通过创建一个名为routes.php 在与插件注册文件.最基本的路由只接受一个 URI 和一个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';
});
你甚至可以注册一个响应所有 HTTP 动词的路由any
方法:
Route::any('foo', function () {
return 'Hello World';
});
生成路由的 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) {
//
});
路由参数总是包含在单数中大括号.参数将传递到您的路线的Closure
当路由被执行时。
NOTE: 路由参数不能包含
-
特点。使用下划线 (_
) 反而。
可选参数
有时您可能需要指定一个路由参数,但该路由参数的存在是可选的。您可以通过放置一个?
在参数名称后标记:
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 或通过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]);
路线组
路由组允许您在大量路由之间共享路由属性,而无需在每个单独的路由上定义这些属性。共享属性以数组格式指定为第一个参数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 () {
// Matches The "/admin/users" URL
});
});
您也可以使用prefix
parameter 为分组路由指定通用参数:
Route::group(['prefix' => 'accounts/{account_id}'], function () {
Route::get('detail', function ($account_id) {
// Matches The 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 异常和对这些错误使用自定义响应的更多信息,请参见错误和记录 文档的一部分。