在使用laravel之前我一直在使用thinkphp还有yii框架,这两个框架也有路由这一说,但是都没有用过。
Laravel的路由功能其实还是挺全的,也很优雅~
下面来说正题:
1.路由的基本介绍
Laravel框架默认为我们提供了两个路由文件,在根目录下的routes目录下有web.php以及api.php。这些文件通过框架自动加载,相应逻辑位于 app/Providers/RouteServiceProvider 类。routes/web.php 文件定义了 Web 界面的路由,这些路由被分配到了 web 中间件组,从而可以使用 Session 和 CSRF 保护等功能。routes/api.php 中的路由是无状态的,这是因为被分配到了 api 中间件组。
一般情况下,我们都会使用web.php来开始定义路由。定义在 routes/web.php 中的路由可以通过在浏览器地址栏输入相应的 URL 进行访问,例如,你可以通过 blog.test/user 访问下面的路由:
Route::get('/user', 'UsersController@index');
正如前面所提到的,定义在 routes/api.php 文件中的路由通过 app/Providers/RouteServiceProvider 的处理被嵌套在一个路由群组中, 在这个群组中,所有路由会被自动添加 /api 前缀,所以你不需要再到路由文件中为每个路由手动添加,你可以通过编辑 RouteServiceProvider 类来修改路由前缀以及其他的路由群组选项:
/** * Define the "api" routes for the application. * * These routes are typically stateless. * * @return void */ protected function mapApiRoutes() { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }
2.有效的路由方法
我们可以注册路由来响应任何 HTTP 请求动作:
Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);
3.路由重定向
如果你需要定义一个重定向到其他 URI 的路由,可以使用 Route::redirect 方法,该方法非常方便,以至于你不需要再定义额外的路由或控制器来执行简单的重定向逻辑:
Route::redirect('/here', '/there');
其中 here 表示原路由,there 表示重定向之后的路由。默认情况下,Route::redirect 返回 302 状态码,你可以使用可选的第三个参数来自定义这个状态码:
Route::redirect('/here', '/there', 301);
你还可以使用 Route::permanentRedirect 方法来返回 301 状态码:
Route::permanentRedirect('/here', '/there');
4.路由参数
(1):必选参数
单个参数
Route::get('user/{id}', function ($id) { return 'User ' . $id; });
多个参数
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { return $postId . '-' . $commentId; });
(2):可选参数
Route::get('user/{name?}', function ($name = null) { return $name; });
5.路由分组
(1):中间件路由分组
要给某个路由分组中定义的所有路由分配中间件,可以在定义分组之前使用 middleware 方法。中间件将会按照数组中定义的顺序依次执行:
Route::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // Uses first & second Middleware }); Route::get('user/profile', function () { // Uses first & second Middleware }); });
(2):路由前缀
prefix 方法可以用来为分组中每个路由添加一个给定 URI 前缀,例如,你可以为分组中所有路由 URI 添加 admin 前缀 :
Route::prefix('admin')->group(function () { Route::get('users', function () { // Matches The "/admin/users" URL }); });
6.兜底路由
使用 Route::fallback 方法可以定义一个当所有其他路由都未能匹配请求 URL 时所执行的路由。通常,未处理请求会通过 Laravel 的异常处理器自动渲染一个「404」页面,不过,如果你在 routes/web.php 文件中定义了 fallback 路由的话,所有 web 中间件组中的路由都会应用此路由作为兜底,当然,如果需要的话,你还可以添加额外的中间件到此路由:
Route::fallback(function () { // });
7.频率限制
Laravel 自带了一个中间件用于限制对应用路由的访问频率。开始使用该功能之前,分配 throttle 中间件到某个路由或路由分组,throttle 中间件接收两个参数用于判断给定时间内(单位:分钟)的最大请求次数。例如,我们指定登录用户每分钟只能访问下面的分组路由 60 次:
Route::middleware('auth:api', 'throttle:60,1')->group(function () { Route::get('/user', function () { // }); });
超出访问次数后,会返回 429 状态码并提示「Too many requests」。
动态频率限制
此外,还可以基于 User 模型的属性来动态设置最大请求次数。例如,如果 User 模型包含 rate_limit 属性,就可以将其这个属性名传递到 throttle 中间件,这样就可以将属性值作为计算最大请求次数的数据来源:
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () { Route::get('/user', function () { // }); });
8.获取当前访问路由属性
你可以使用 Route 门面上的 current、currentRouteName 和 currentRouteAction 方法来访问处理当前输入请求的路由信息:
// 获取当前路由实例 $route = Route::current(); // 获取当前路由名称 $name = Route::currentRouteName(); // 获取当前路由action属性 $action = Route::currentRouteAction();