Dingo Api 1.0在laravel5.2中的簡單應用

Dingo Api是爲基於laravel的開發提供了一系列工具集,這些工具集能夠幫助開發者快速構建APIDingo Api最新的版本是2.0.0-alpha1,這個版本須要php7.0以上的php版本的支撐,筆者這裏以Dingo Api 1.0爲例簡單介紹其在laravel5.2中的應用。

安裝Dingo Api

  • composer.json中的require中添加"dingo/api": "1.0.*@dev"php

     
    composer.json

     

  • 執行composer updatelaravel

     
    composer update

     

配置Dingo Api

  • config/app.phpproviders中增長Dingo\Api\Provider\LaravelServiceProvider::class,
  • 執行php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"以生成config下配置文件
     
    vendor:publish
  • config/app.phpaliases中添加'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), // 開啓調試便於開發 上線後關閉之 

建立API路由

  • 建立App\Http\Controllers\Api\V1\UserController.phpjson

     
    建立控制器

     

  • 建立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'); 
  • 在控制檯查看路由數組


     
    查看路由

建立API並訪問

  • 完善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(); } 
 
user.index
  • 數組響應
    修改App\Http\Controllers\Api\V1\UserControllerindex方法:
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); //修改 } } 
 
transformer user.show

實現分頁

  • 執行php artisan make:seeder UsersTableSeeder

     
    make:seeder

     

  • 修改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

     
    db:seed

     
    users

     

  • 修改App\Http\Controllers\Api\V1\UserControllerindex方法:

public function index() { $users = User::paginate(8); return $this->response->paginator($users, new UserTransformer); } 
 
paginate user.index

更多響應

  • 指定信息和狀態碼的錯誤響應
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); 
 
獲取access_token
  • 訪問須要受權的接口


     
    不帶access_token訪問
 
帶錯誤的access_token訪問
 
帶正確的access_token訪問

本文首發於公衆號:programmer_cc,轉載請註明出處。

相關文章
相關標籤/搜索