Laravel的api接口包dingo的用法要点

2017/2/21 posted in  LARAVEL

准备环境(php7+laravel)

-> composer create-project --prefer-dist laravel/laravel laravel-dingo`

安装dingo

-> composer require dingo/api:1.0.x@dev

编辑app/config.php、在provider配置块里注册dingo包到laravel框架中

Laravel\Tinker\TinkerServiceProvider::class,
Dingo\Api\Provider\LaravelServiceProvider::class,
```php
在config目录生成dingo的配置配置文件
```shell
-> php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

然后在config目录中会生成api.php就是dingo的配置文件

dingo包提供了两个门面
Dingo\Api\Facade\API
Dingo\Api\Facade\Route

在.env文件中开启调试模式、以方便在出错时查看出错的详细信息和配置api路由的url前缀

API_PREFIX=api

API_DEBUG=true

注意:如果api前缀dingo的api前缀是api会覆盖laravel默认的api前缀。

路由
为了避免和laravel自带的路由冲突、必须使用dingo提供的路由对象注册路由

在路由文件中获取api路由对象、编辑routes/web.php

获取dingo的路由对象:$api = app('Dingo\Api\Routing\Router');
版本
因为app接口路由有多个版本、通过路由前缀进行区分、所以dingo默认自带version来为路由创建版本

编辑routes/web.php

$api->version('v1', function() {
    // 注册第一版路由
});
$api->version('v2', function() {
    // 注册第二版路由
});

注册路由使用Laravel的路由语法

$api->version('v1', function ($api) {
    $api->get('users', 'App\Api\V1\Controllers\UserController@index');
    $api->get('users/{id}', 'App\Api\V1\Controllers\UserController@show');
});

$api->version('v2', function ($api) {
    $api->get('users', 'App\Api\V2\Controllers\UserController@index');
});

注意:必须将控制器的名字连同名字空间写全。

查看已注册的api路由:php artisan api:routes

λ pphp artisan api:routes                                                                                                                  
+------+----------+-----------------+------+---------------------------------------------+-----------+------------+----------+------------+
| Host | Method   | URI             | Name | Action                                      | Protected | Version(s) | Scope(s) | Rate Limit |
+------+----------+-----------------+------+---------------------------------------------+-----------+------------+----------+------------+
|      | GET|HEAD | /api/users      |      | App\Api\V1\Controllers\UserController@index | No        | v1         |          |            |
|      | GET|HEAD | /api/users/{id} |      | App\Api\V1\Controllers\UserController@show  | No        | v1         |          |            |
|      | GET|HEAD | /api/users      |      | App\Api\V2\Controllers\UserController@index | No        | v2         |          |            |
+------+----------+-----------------+------+---------------------------------------------+-----------+------------+----------+------------+

此时UserController内容

<?php

namespace App\Api\V1\Controllers;

use App\User;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Request;

class UserController extends Controller
{
    public function index()
    {
    }

    public function show(Request $request, $id)
    {
    }
}

通过浏览器访问:/api/users/1,既没有内容输出、也没有错误产生证明已经请求已经抵达控制器。

在控制器中返回数据给接口调用方
返回从模型中查询的所有数据

class UserController
{
    public function index()
    {
        return User::all();
    }
}

访问/api/users返回值:

{"users":[{"id":1,"name":"\u82cf\u5c0f\u6797","email":"dear.lin@live.com","created_at":"2017-02-18 23:44:00","updated_at":null},{"id":2,"name":"\u5c0f\u6797\u8001\u5e08","email":"dear.lin@live.com","created_at":"2017-02-18 23:44:00","updated_at":null}]}

返回从模型中查询的一行数据
访问/api/users/1返回值:

public function show(Request $request, $id)
{
    return User::findOrFail($id);
}

还可以返回数组需要使用dingo的助手代码

在控制器内引入dingo的助手

<?php

namespace App\Api\V1\Controllers;

use App\User;
use Dingo\Api\Routing\Helpers;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Request;

class UserController extends Controller
{
    use Helpers;
    public function index()
    {
        return User::all();
    }

    public function show(Request $request, $id)
    {
        $user = User::findOrFail($id);
        return $this->response->array($user->toArray());;
    }
}

访问/api/users/1的返回值:

{"id":1,"name":"\u82cf\u5c0f\u6797","email":"dear.lin@live.com","created_at":"2017-02-18 23:44:00","updated_at":null}

使用以上的内容基本可以满足app接口开发的需要、剩余高级内容需要时补上~~~

参考资料

  1. https://github.com/dingo/api/wiki
  2. https://laravel.com/docs/5.4/passport