源码php
本文使用的数据库与基础篇相同,故再也不重复说明。laravel
安装git
$ composer require dingo/api:1.0.x@dev
注册github
/config/app.php 'providers' => [ Dingo\Api\Provider\LaravelServiceProvider::class, ],
为了可以自定义配置,首先须要执行数据库
$ php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider" Copied File [/vendor/dingo/api/config/api.php] To [/config/api.php] Publishing complete.
能够看到多了个 api.php
的配置文件,咱们就能够在 .env
中对其进行配置,一些经常使用的配置项:json
/.env API_STANDARDS_TREE=vnd # 公开的及商业项目用 vnd API_SUBTYPE=api-demo # 项目简称 API_PREFIX=api # 前缀 API_VERSION=v1 # 不提供版本时使用的版本号 API_NAME="Laravel Api Demo" # 使用 API Blueprint 命令生成文档的时候才用到 API_STRICT=false # Strict 模式要求客户端发送 Accept 头而不是默认在配置文件中指定的版本,这意味着你不能经过Web浏览器浏览API API_DEFAULT_FORMAT=json API_DEBUG=true # 开启 debug 模式
建立一个基本的端点(路由在 api 中的叫法)测试下是否配置成功api
/routes/api.php $api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->get('test', function () { return 'It is ok'; }); });
访问 /api/test
,返回 It is ok
。浏览器
Dingo 的用法与以前的自定义 api 用法相似,甚至更加简单。首先定义路由app
/routes/api.php $api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->group(['namespace' => 'App\Api\Controllers'], function ($api) { $api->resource('lessons','LessonController'); }); });
若是要查看路由,须要使用composer
$ php artisan api:routes
建立控制器 - 须要使用 Helpers
这个 trait。
/app/Api/Controllers/LessonController.php <?php namespace App\Api\Controllers; use App\Api\Transformers\LessonTransformer; use App\Http\Controllers\Controller; use App\Lesson; use Dingo\Api\Routing\Helpers; class LessonController extends Controller { use Helpers; public function index() { $lessons = Lesson::all(); // collection 用于响应一个集合,同时绑定一个 Transformer 来格式化数据 return $this->collection($lessons, new LessonTransformer()); } public function show($id) { // 尽管咱们返回的不是 json,可是 dingo 会自动进行转化 return Lesson::findOrFail($id); } }
建立对应的 LessonTransformer
/app/Api/Transformers/LessonTransformer.php <?php namespace App\Api\Transformers; use App\Lesson; use League\Fractal\TransformerAbstract; class LessonTransformer extends TransformerAbstract { public function transform(Lesson $lesson) { return [ 'title' => $lesson['title'], 'content' => $lesson['body'], 'is_free' => (bool) $lesson['free'] ]; } }
访问 api/lessons/3
,结果以下
能够看出,Dingo 自动将响应的数据转化为了 json,不过咱们还须要将其格式化
public function show($id) { $lesson = Lesson::findOrFail($id); return $this->response->item($lesson, new LessonTransformer()); }
如今,就能够获得格式化的数据了
跟 Laravel 相似,也可使用分页
public function index() { $lessons = Lesson::paginate(15); return $this->response->paginator($lessons, new LessonTransformer()); }
将会返回 15 条信息以及分页信息
当请求出错时,Dingo 会自动帮咱们进行处理
也能够自定义
public function show($id) { $lesson = Lesson::find($id); if(!$lesson){ return $this->response->errorNotFound("错误的 id"); } return $this->response->item($lesson, new LessonTransformer()); }
结果以下
咱们能够在 Api 中加入自带的验证功能,好比 HTTP 基础认证。首先,建立一个测试用户
$ php artisan tinker >>> $user = new \App\User(); >>> $user->name = "zen" >>> $user->email = "ihuangmx@qq.com" >>> $user->password = bcrypt("123456") >>> $user->save() => true
在控制器中加入 Laravel 自带的中间件便可
public function __construct() { $this->middleware('auth.basic'); }
如今访问时会提示输入用户名和密码,这里的用户名指的是邮箱