前段时间写的古诗词文api使用了,Dingo/api,tymondesigns/jwt-auth。
为了更加方便,而不是局限于Dingo/api框架中,我使用spatie/laravel-fractal,和lsxiao/jwt-auth,来替代前面的两个扩展包。
但是Dingo/api是支持嵌套路由群组的,而lumen自带的route不支持嵌套路由群组,这将会导致路由代码量增多,且不方便维护。
例如如下的路由,lumen是不支持的,因为有两层群组嵌套。
//诗词 $app->group(['prefix' => 'posts'], function () use ($app) { $app->get('', [ 'as' => 'posts.index', 'uses' => 'PostController@index', ]); $app->get('{id}', [ 'as' => 'posts.show', 'uses' => 'PostController@show', ]); //需要认证的路由 $app->group(['middleware' => 'jwt.auth'], function () use ($app) { //收藏某诗词 $app->post('{id}/collect', [ 'as' => 'posts.collect', 'uses' => 'PostController@collect', ]); //取消收藏某诗词 $app->post('{id}/uncollect', [ 'as' => 'posts.uncollect', 'uses' => 'PostController@uncollect', ]); //喜欢某诗词 $app->post('{id}/like', [ 'as' => 'posts.like', 'uses' => 'PostController@like', ]); //取消喜欢某诗词 $app->post('{id}/unlike', [ 'as' => 'posts.unlike', 'uses' => 'PostController@unlike', ]); }); });
所以我就去lumen的issues里面看,果然已经有很多相关的回答了,相关开发者回应说,没有支持嵌套路由群组的计划,理由是Lumen是一个微型框架,所以在路由设计上并没有实现Laravel的嵌套路由,如果要使用嵌套路由群组,请使用Laravel。
但是我就是想在Lumen上用嵌套路由群组怎么办?
广大的githuber是不会因为这个操蛋的不支持的回答而放弃的,之后我发现了下面的好东西。
安装
composer require "fremail/lumen-nested-route-groups:~1.0"
配置
在bootstrap/app.php文件中,将Application class替换掉。
替换前
$app = new Laravel\Lumen\Application( realpath(__DIR__.'/../') );
替换后
$app = new Fremail\NestedRouteGroups\Application( realpath(__DIR__.'/../') );
之后就可以愉快的使用嵌套群组了,php artisan route:list 测试下,完全没问题。
命名空间类型
不过这里的默认namespace 是Laravel风格,也就是默认命名空间是App\Http\Controllers,所以之后的嵌套路由不需要写全,不过我个人在Lumen中喜欢使用完整的nampsace。
当然,这样是可以配置的。
从 vendor/fremail/lumen-nested-route-groups/config 文件夹复制NestedRouteGroups.php 到 lumen项目根目录的config文件夹。
打开NestedRouteGroups.php,设置namespace为'full'即可。
之后在boostrap/app.php中 $app->configure('NestedRouteGroups'); 应用配置即可。
然后我就可以这样写了:
$app->group(['namespace' => 'App\Http\Controllers\api\v1'], function () use ($app) { //认证 $app->group(['prefix' => 'auth'], function () use ($app) { .... }); //诗词 $app->group(['prefix' => 'posts'], function () use ($app) { .... }); }