路由器服务

基本路由

虽然路由是自动处理的后端控制器 和 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 异常和对这些错误使用自定义响应的更多信息,请参见错误和记录 文档的一部分。

豫ICP备18041297号-2