Dingo Api
是为基于laravel
的开发提供了一系列工具集,这些工具集能够帮助开发者快速构建API
。Dingo Api
最新的版本是2.0.0-alpha1
,这个版本须要php7.0
以上的php
版本的支撑,笔者这里以Dingo Api 1.0
为例简单介绍其在laravel5.2中的应用。在composer.json
中的require
中添加"dingo/api": "1.0.*@dev"
php
执行composer update
laravel
config/app.php
的providers
中增长Dingo\Api\Provider\LaravelServiceProvider::class,
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
以生成config
下配置文件config/app.php
的aliases
中添加'Api' => Dingo\Api\Facade\API::class,
config/api.php
'standardsTree' => env('API_STANDARDS_TREE', 'vnd'), // 项目须要能被公开访问 'subtype' => env('API_SUBTYPE', 'blog'), // 根据项目名称配置 'prefix' => env('API_PREFIX', 'api'), // 能够根据需求去设置 这里设置成api 'name' => env('API_NAME', 'Blog Api'), // 根据项目设置 'debug' => env('API_DEBUG', true), // 开启调试便于开发 上线后关闭之
建立App\Http\Controllers\Api\V1\UserController.php
json
建立API
路由器api
// 在app/Http/routes.php中增长 $api = app('Dingo\Api\Routing\Router');
// 在app/Http/routes.php中增长 $api->version('v1', function ($api) { $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 });
URL
// 在app/Http/routes.php中增长 app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.show', 'id');
// 在app/Http/routes.php中增长 $api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 }); app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.show', 'id');
在控制台查看路由数组
App\Http\Controllers\Api\V1\UserController
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; // 这里能够去掉没用的内容 use App\User; // 引用模型 class UserController extends Controller { public function show($id) // 接口方法 { return User::findOrFail($id); } }
访问接口php7
经过响应构建器能够构建更多自定义响应。app
建立基类composer
填充基类内容
具体代码以下:curl
<?php namespace App\Http\Controllers\Api\V1; // 自动生成的内容能够去掉 use Dingo\Api\Routing\Helpers; // trait use Illuminate\Routing\Controller; // 增长 class BaseController extends Controller { use Helpers; }
App\Http\Controllers\Api\V1\UserController
为:<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Api\V1\BaseController; // 此处有调整 use App\User; // 引用模型 class UserController extends BaseController // 此处有调整 { public function show($id) // 接口方法 { return User::findOrFail($id); } }
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->array($user->toArray()); }
$api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 $api->get('user', ['as' => 'user.index', 'uses' => 'App\Http\Controllers\Api\V1\UserController@index']); // 注意此处controller要写完整命名空间 增长行 }); app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.show', 'id'); app('Dingo\Api\Routing\UrlGenerator')->version('v1')->route('user.index'); // 增长行
App\Http\Controllers\Api\V1\UserController
增长方法:public function index() { return User::all(); }
App\Http\Controllers\Api\V1\UserController
的index
方法:public function index() { $users = User::all(); return $this->response->array($users->toArray()); }
转换器用于对数据进行过滤和转化用以提供更加人性化的数据。ide
App\Transformers\Api\V1\UserTransformer.php
<?php namespace App\Transformers\Api\V1; use League\Fractal\TransformerAbstract; use App\User; class UserTransformer extends TransformerAbstract { public function transform(User $user) { return [ 'name' => $user->name, 'email' => $user->email, 'created_at' => date('Y-m-d', strtotime($user->created_at)) ]; } }
App\Http\Controllers\Api\V1\UserController
:<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Api\V1\BaseController; use App\Transformers\Api\V1\UserTransformer; // 增长行 use App\User; // 引用模型 class UserController extends BaseController { public function index() { $users = User::all(); return $this->response->array($users->toArray()); } public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer); //修改 } }
执行php artisan make:seeder UsersTableSeeder
修改database\seeds\UsersTableSeeder.php
<?php use Illuminate\Database\Seeder; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { factory(App\User::class, 50)->create(); // 增长一行 } }
执行php artisan db:seed --class=UsersTableSeeder
修改App\Http\Controllers\Api\V1\UserController
的index
方法:
public function index() { $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); }
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->error('This is an error.', 404); }
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorNotFound(); }
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorBadRequest(); }
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorForbidden(); }
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorInternal(); }
public function index() { /* $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); */ return $this->response->errorUnauthorized(); }
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->withHeader('author', 'stone'); }
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->addMeta('author', 'stone'); }
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->setMeta(['author' => 'stone', 'date' => date('Y-m-d')]); }
public function show($id) // 接口方法 { $user = User::findOrFail($id); return $this->response->item($user, new UserTransformer)->setStatusCode(202); }
这一步须要提供oAuth
的支持,可参考oAuth2.0在laravel5.2中的简单应用
oAuth
中间件$api->version('v1', ['middleware' => 'oauth'], function ($api) { // 加上中间件 $api->get('user/{id}', ['as' => 'user.show', 'uses' => 'App\Http\Controllers\Api\V1\UserController@show']); // 注意此处controller要写完整命名空间 $api->get('user', ['as' => 'user.index', 'uses' => 'App\Http\Controllers\Api\V1\UserController@index']); // 注意此处controller要写完整命名空间 });
access_token
http://www.test.com/test.php
访问的脚本,内容以下:function post($url, $param){ $oCurl = curl_init(); $aPOST = []; foreach($param as $key=>$val){ $aPOST[] = $key.'='.urlencode($val); } $strPOST = join('&', $aPOST); curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(200 == intval($aStatus['http_code'])){ return $sContent; }else{ return false; } } $server = 'http://localhost:8000/oauth/access_token'; $params = [ 'grant_type' => 'password', 'username' => 'admin@admin.com', 'password' => '123456', 'client_id' => 'shy7jf8fa93d59c45502c0ae8chj76s', 'client_secret' => 'bc7f6f8fa93d59c45502c0ae8c4a95d', ]; echo post($server, $params);
访问须要受权的接口
本文首发于公众号:programmer_cc,转载请注明出处。