API Endpoints
这个没有办法翻译,就是route
的意思,也有很多人(这个应该指老外或者装逼者),当我们在讨论APIs很多人指的意思就是the routes you visit as an endpoint
API的版本GROUP
为了避免你的主程序路由到这个包的时候采用它自己的路由,我们就必须新建一个api路由的对象
$api = app('Dingo\Api\Routing\Router');
然后必须定义version group, 这样我们可以为不同的版本创建相同的路由,这样方便版本管理和开发
提示: 这里的$api->version
可以理解为特殊的$api->group
$api->version('v1', function ($api) {
});
如果需要一个组可以响应多个版本,这样写
$api->version(['v1', 'v2'], function ($api) {
});
这个group的用法和laravel自带的标准group用法一样,也可以传递数组作为第二个参数
$api->version('v1', ['middleware' => 'auth'], function ($api) {
});
我们的路由还可以分的在细致一点,比如version中嵌套group
$api->version('v1', function ($api) {
$api->group(['middleware' => 'foo1'], function ($api) {
});
$api->group(['middleware' => 'foo2'], function ($api) {
});
});
关于中间件这个东西,个人还是喜欢放在每个controller中,这样感觉会更清楚点,是不是 ???
创建路由
有了上面的版本号组,现在就可以创建endpoints了,通过带有参数为$api的闭包函数,如下:
$api->version('v1', function ($api) {
$api->get('users/{id}', 'App\Api\Controllers\UserController@show');
});
上面这样写好麻烦,能不能像laravel一样,在某个地方把App\Api\Controllers
放在一个命名空间下,这样写的时候,就不用写App\Api\Controllers
了,
上面的问题可以这么解决(还没测试,不知道对不对):
$api->version('v1', ['namespace' => 'Api\Controllers'], function ($api) {
$api->get('users/{id}', 'UsersController@show');
});
//在app\api\controllers\UsersController.php中声明命名空间为Api\Controllers;
还有就是php artisan make:controller
这个命令怎么搞??
因为Endpoint以版本号进行分组,所以你可以使用同样的URI为同一Endpoint创建不同的响应:
$api->version('v1', function ($api) {
$api->get('users/{id}', 'App\Api\V1\Controllers\UserController@show');
});
$api->version('v2', function ($api) {
$api->get('users/{id}', 'App\Api\V2\Controllers\UserController@show');
});
从这里可以看出,dingo推荐的api的Controller的目录为
app/Api/v1/Controller
//还有
app/Api/v1/Request (处理middleware)
app/Api/v1/Transfomers
要不要v1目录,感觉太深了???
路由别名
$api->get('users/{id}', ['as' => 'users.index', 'uses' => 'App\Api\V1\UserController@show']);
我们要生成路由的时候就可以用这个别名:
app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('users.index');
// 必须提供一个版本号以便URL可以基于该版本号生成,同时,你可以在不同版本号中使用同一个命名路由。
//其实感觉也没有什么卵用,直接xx->version('v1')->route('users/{id}'); 不行吗??
控制台查看api 路由的命令
$ php artisan api:routes