路由

未匹配的标注

HTTP 路由

基础路由

你可以在 routes/web.php 中定义路由,其中最基础的路由只需要接受一个简单的 URI 和一个闭包。

$router->get('foo', function () {
    return 'Hello World';
});

$router->post('foo', function () {
    //
});

可用的路由方法

路由器允许你注册能响应任何 HTTP 请求的路由:

$router->get($uri, $callback);
$router->post($uri, $callback);
$router->put($uri, $callback);
$router->patch($uri, $callback);
$router->delete($uri, $callback);
$router->options($uri, $callback);

路由参数

必填参数

当然,有时需要在路由中捕获一些 URL 片段。例如,从 URL 中捕获用户的 ID,可以通过定义路由参数来执行此操作:

$router->get('user/{id}', function ($id) {
    return 'User '.$id;
});

也可以根据需要在路由中定义多个参数:

$router->get('posts/{postId}/comments/{commentId}', function ($postId, $commentId) {
    //
});

路由参数通常会包含在 {} 中,当路由被执行时,这些参数将会被传递给路由的闭包。

注意: 路由参数不能包含横线 -,不过可以包含下划线 (_)。

可选参数

您可以将路由URI定义的一部分包含在“ […]”中来定义可选的路由参数。例如, /foo[bar] 将匹配 /foo/foobar。可选参数仅在URI的末尾位置受支持。换句话说,您不能在路径定义的中间放置可选参数。

$router->get('user[/{name}]', function ($name = null) {
    return $name;
});

正则表达式约束

您可以通过在路由定义中定义一个正则表达式来限制路由参数的格式:

$router->get('user/{name:[A-Za-z]+}', function ($name) {
    //
});

命名路由

命名路由可以方便地生成URL或特定路由的重定向。您可以在定义路由时使用“ as”数组键为路由指定名称:

$router->get('profile', ['as' => 'profile', function () {
    //
}]);

您还可以为控制器操作指定路由名称:

$router->get('profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);

根据路由别名生成URL

一旦你定义命名路由,就可以根据路由别名生成 URL 或者使用全局函数 route进行路由重定向。

// 生成 URLs
$url = route('profile');

// 重定向
return redirect()->route('profile');

如果命名路由包含路由参数,就可以将路由参数作为第二个参数传递给全局函数 route,这些参数将自动的被插入当前 URL 的正确位置。

$router->get('user/{id}/profile', ['as' => 'profile', function ($id) {
    //
}]);

$url = route('profile', ['id' => 1]);

路由组

路由组允许子路由共享路由属性,例如中间件、命名空间等。这样所有属于该路由组的子路由都不用单独的设置这些共享属性,共享属性组成一个关联数组,并将这个数组作为第一个参数传递给 $this->group 方法。

我们将通过介绍该功能的几个常见用例,来了解更多关于路由组的用法。

中间件

要给路由组中所有的路由分配中间件,可以在 group 之前调用 middleware 方法,中间件会依照它们在数组中列出的顺序来运行:

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->get('/', function () {
        // Uses Auth Middleware
    });

    $router->get('user/profile', function () {
        // Uses Auth Middleware
    });
});

命名空间

另一个常见用例是使用 namespace 方法将相同的 PHP 命名空间分配给路由组的中所有的控制器。

$router->group(['namespace' => 'Admin'], function() use ($router)
{
    // Using The "App\Http\Controllers\Admin" Namespace...

    $router->group(['namespace' => 'User'], function() use ($router) {
        // Using The "App\Http\Controllers\Admin\User" Namespace...
    });
});

路由前缀

可以用 prefix 方法为路由组中给定的 URL 增加前缀。例如,你可以为组中所有路由的 URI 加上 admin 前缀:

$router->group(['prefix' => 'admin'], function () use ($router) {
    $router->get('users', function () {
        // Matches The "/admin/users" URL
    });
});

您还可以使用 prefix 参数为分组的路由指定通用参数

$router->group(['prefix' => 'accounts/{accountId}'], function () use ($router) {
    $router->get('detail', function ($accountId) {
        // Matches The "/accounts/{accountId}/detail" URL
    });
});

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:6
讨论数量: 0
发起讨论 只看当前版本


暂无话题~