Laravel中使用dingo

dingo相关文档

dingo 安装包地址 https://github.com/dingo/api/
dingo 文档 https://github.com/dingo/api/wiki
简介:

dingo api包是给laravel和lumen提供的Restful的工具包,它可以与jwt组件一起配合快速的完成用户认证,同时对于数据和运行过程中所产生的异常能够捕获到并且可以做出对应的响应。
laravel中安装及配置dingo

1、在laravel的根目录下修改composer.json的内容。注意查看最新版本:
Laravel中使用dingo_第1张图片
使用composer update 的方法,在laravel的根目录下修改composer.json的内容。

"require": {
    "dingo/api": "v2.2.2"
}

Laravel中使用dingo_第2张图片
然后在命令行执行 composer update。注意执行composerupdate的时候会把里面所有的内容都更新,所以如果是线上产品的话,一般使用如下方法:

composer require dingo/api:v2.2.2

Laravel中使用dingo_第3张图片
2、发布配置:

通过 vendor:publish 发布dingo 的配置
实际就是把dingo下的配置文件发布出来,放在config/api.php中

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

在这里插入图片描述
注意:当引用了dingo之后,laravel中自带的路由api就会失效。会直接被dingo的路由服务所进行接管。(也就是说原先所定义的laravel的api服务中间件则不能够使用,如果说需要使用就需要在重新配置,如何重新配置请看后面的内容)。

3、配置:在使用之前需要进行配置

也就是dingo的配置信息config/api.php 。可以打开配置文件,有下面的参数内容即可:
Laravel中使用dingo_第4张图片
根据上面的信息在.env里面配置,如下:

API_STANDARDS_TREE=prs
API_SUBTYPE=laravel57weidian
API_PREFIX=api
API_VERSION=v1
API_DEBUG=true

至此laravel配置完毕。

dinggo使用

1、dingo使用文档地址:https://github.com/dingo/api/wiki/Creating-API-Endpoints
在routes/api.php 里面测试使用:

$api = app('Dingo\Api\Routing\Router');
//这里的version是版本,里面的v1是在env里面定义好的。
$api->version('v1', function($api) {
    $api->get('test', function(){
        return 'this is test dingo api';
    });
});

Laravel中使用dingo_第5张图片
然后在postman里面测试:
Laravel中使用dingo_第6张图片
2、版本管理:
如果我们需要切换版本,env配置里面的还是v1版本,但是api.php,我们使用v2版本的话:

$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function($api) {
    $api->get('test', function(){
        return 'this is test dingo api--222';
    });
});
//如果切换版本
$api->version('v2', function($api){
    $api->get('test2', function(){
        return 'this is test dingo api 切换版本';
    });
});

在postman里面需要这样配置:
Laravel中使用dingo_第7张图片
这样就实现了版本隐藏的功能…

3、jwt与dingo结合使用:
由于dingo接管了laravel原生的api路由,在routes/api.php里面路由如下配置:

$api->version('v1',[
    'namespace'=>'App\Http\Controllers\Api\V1',
    'middleware'=>['bindings']
], function($api) {
    $api->post('login', 'AuthController@login');
    $api->post('logout', 'AuthController@logout');
    $api->post('refresh', 'AuthController@refresh');
    $api->get('user','AuthController@user')->middleware('api:auth');
});

4.返回信息:

如果使用dingo的话,返回信息可以这样使用:
文档地址:https://github.com/dingo/api/wiki/Responses
Laravel中使用dingo_第8张图片
测试的返回信息如下:
Laravel中使用dingo_第9张图片

dingo接管laravel api路由后如何自定义路由

1、首先看一下laravel自带的路由助手
找到laravel的助手函数文件:vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
Laravel中使用dingo_第10张图片
从代码中可以看到,首先会通过app解析出在容器中绑定的url的标识,通过在绑定容器中的标识查找既可以找到url的所对应的服务类UrlGenerator
Laravel中使用dingo_第11张图片
然后打开dingo的源码,可以看到在dingo中的helpers中存在一个助手函数
Laravel中使用dingo_第12张图片
根据注释理解,就是它会返回一个Dingo\Api\Routing\UrlGenerator的对象,dingo的这个类名的UrlGenerator与laravel自带的UrlGenerator是同名,这样就会走dingo的url路由转发
因此我们就可以理解 dingo中的helpers的version() 与laravel的helpers中的app(‘url’)是一个作用。
version() = app(‘url’);
因此根据与route()这个助手函数在dingo\helpers中创建一个route_api();
把route的内容复制到dingo\helpers.php中
Laravel中使用dingo_第13张图片
version翻译就是版本的意思,这里就是api的版本给个默认为v1
Laravel中使用dingo_第14张图片
测试;为了方便在web.php中定义一个test的路由,然后测试
Laravel中使用dingo_第15张图片
然后把中间件完善

不过其实这种方式并不是很好,直接在dingo\helpers.php中添加自定义的内容;因为版本会更新的所以,如果通过composer update一下。然后很尴尬的事情的时候就会发生;运行项目就会出现 api_route方法不存在
所以为了比较好的效果的话,那么可以这么做自定义一个helpers.php 的文件;

关于laravel对于helpers.php的加载;如下内容知道即可
vendor/laravel/framework/src/Illuminate/Foundation/helpers.php 这是laravel自带的helpers.php助手函数文件
它是通过composer.json加载载入的:
Laravel中使用dingo_第16张图片
而composer的自带加载就在入口文件public/index.php 的第二行加载了;

综上所述我们用以下方法实现:
自定义一个helpare.php到 app\Support目录下:
Laravel中使用dingo_第17张图片
然后在项目的根目录下的composer.json中加入如下内容:
Laravel中使用dingo_第18张图片
这样还不行还需要对于composer.json重新编译
执行命令 composer dump-autoload

然后进行测试:
Laravel中使用dingo_第19张图片
最后细节调节:
Laravel中使用dingo_第20张图片
Laravel中使用dingo_第21张图片
这样会报错,因为路由助手是我们自己定义的,不是之前系统自带的,不能用连写:
Laravel中使用dingo_第22张图片

你可能感兴趣的:(laravel)