使用 Laravel 开发 API,参考了网上一些资料,laravel 默认已经支持了 API 开发,但是因为都没有了解过,打算尝试使用 Dingo API
github 地址:
https://github.com/dingo/api
laravel-china 中文文档:
https://laravel-china.org/docs/dingo-api/2.0.0
文档写的非常详细,翻译的也非常好,但是需要仔细品读,另外 Dingo API 中使用到了其他两个技术,也需要了解下。之前已经写过笔记了,可参考:
fractal - https://blog.csdn.net/beyond__devil/article/details/83870176
jwt-auth - https://blog.csdn.net/beyond__devil/article/details/83827075
这里简单挑几个重点写下:
1.安装
composer require dingo/api
发布配置
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
Facades
Dingo\Api\Facade\API
Dingo\Api\Facade\Route
2.配置信息
3.创建端点(在 API 中,路由一般叫做端点)
1)引用 Dingo API
$api = app('Dingo\Api\Routing\Router');
2)设置版本分组
// 单个分组
$api->version('v1', function($api){
})
// 多个分组
$api->version(['v1', 'v2'], function($api){
})
// 第二个参数,还可以传递一个 『属性数组』
$api->version(['v1', 'v2'], ['middleware' => 'foo'], function($api){
})
注意:
属性数组,是旧版的 Laravel,5.7 版本有些可能不支持
// 其他的和 laravel 的路由没有太大的区分(旧版,新版链式调用不支持)
$api->version('v1', function($api){
$api->group(['middleware' => 'bar'], function($api){
...
});
})
3)创建端点(之前大概看了点源码,忘记了,下面是之前笔记的)
group() - 路由分组
domain() - 子域名路由
namespace() - 命名空间
prefix() - 前缀
name() - 命名前缀,是 as 的别名
as() - 命名前缀
middle() - 中间件
where() - 参数的正则约束
/*
5.7 版本,可以使用这些方法,之前的版本,没有这些方法,使用的是:
group(['prefix' => '', 'namespace' => '', ...], function(){
});
*/
4)命名路由 & 生成路由
$api->get('users/{id}', ['as' => 'users.index', 'uses' => 'Api\V1\UserController@show']);
app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('users.index');
5)命令行中查看路由
php artisan api::routes
注意:
Laravel 5.7版本,routes/api.php 默认就具备中间件,我们需考虑使用 'Dingo API' 还是 'Laravel 系统默认'
app/Providers/RouteServiceProvider.php
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
注意:
如果采用 Ding API,我们可能得取消这里默认的 prefix、middleware、namespace
4.响应
响应生成器,需要使用 'Dingo\Api\Routing\Helpers' trait。我们的 API 控制器基本都要使用它,所以创建一个 『基类控制器』
php artisan make:controller Api/Controller
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use Dingo\Api\Routing\Helpers;
use App\Http\Controllers\Controller as BaseController;
class Controller extends BaseController
{
use Helpers;
}
关于响应生成器,文档写的很详细,上次可能看了下源码,总结了下,基本和文档一致。
参考源码:Dingo\Api\Http\Response\Factory
1)响应数组
$user = User::findOrFail($id);
$this-