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,轉載請註明出處。