Laravel 中使用 DingoAPI

  • 2019 年 12 月 17 日
  • 筆記

Laravel 中使用 DingoAPI

安裝laravel 這裡以5.5版本為例

composer create-project laravel/laravel laravel-api --prefer-dist "5.5.*"

1. 安裝 DingoAPI

composer require dingo/api:2.0.0-alpha2

發現報錯

Problem 1      - Conclusion: remove laravel/framework v5.5.40      - Conclusion: don't install laravel/framework v5.5.40      - dingo/blueprint 0.2.2 requires illuminate/filesystem 5.1.* || 5.2.* || 5.3.* || 5.4.* -> satisfiable by illuminate/filesystem[v5.1.1, v5.1.13, v5.1.16, v5.1.2, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.6, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7, v5.3.0, v5.3.16, v5.3.23, v5.3.4, v5.4.0, v5.4.13, v5.4.17, v5.4.19, v5.4.27, v5.4.36, v5.4.9].      - dingo/blueprint v0.2.0 requires illuminate/filesystem 5.1.* || 5.2.* || 5.3.* -> satisfiable by illuminate/filesystem[v5.1.1, v5.1.13, v5.1.16, v5.1.2, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.6, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7, v5.3.0, v5.3.16, v5.3.23, v5.3.4].      - dingo/blueprint v0.2.1 requires illuminate/filesystem 5.1.* || 5.2.* || 5.3.* -> satisfiable by illuminate/filesystem[v5.1.1, v5.1.13, v5.1.16, v5.1.2, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.6, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7, v5.3.0, v5.3.16, v5.3.23, v5.3.4].      - don't install illuminate/filesystem v5.1.1|don't install laravel/framework v5.5.40      ...

因為這個包尚處在開發階段,暫時沒有穩定版,因此 我們需要手動添加。

打開 composer.json 手動添加 手動添加 "dingo/api": "2.0.0-alpha2"

"require": {          "php": ">=7.0.0",          "fideloper/proxy": "~3.3",          "laravel/framework": "5.5.*",          "laravel/tinker": "~1.0",          "dingo/api": "2.0.0-alpha2"      },

執行composer update

composer update

稍等片刻,哇哦,順利安裝……

2. 配置

dingo 的配置文件發佈出來

php artisan vendor:publish
Which provider or tag's files would you like to publish?:    [0] Publish files from all providers and tags listed below    [1] Provider: DingoApiProviderLaravelServiceProvider    [2] Provider: FideloperProxyTrustedProxyServiceProvider    [3] Provider: IlluminateMailMailServiceProvider    [4] Provider: IlluminateNotificationsNotificationServiceProvider    [5] Provider: IlluminatePaginationPaginationServiceProvider    [6] Provider: LaravelTinkerTinkerServiceProvider    [7] Tag: laravel-mail    [8] Tag: laravel-notifications    [9] Tag: laravel-pagination

按照命令行交互,我們輸入 1 即可。接着就會在 config 目錄下生成 api.php,可以打開大體瀏覽下各項配置,裏面的每一項都可以用 env 文件來配置。

我們暫時只關心如下配置:

  • API_STANDARDS_TREE
  • API_SUBTYPE
  • API_VERSION
  • API_PREFIX
  • API_DOMAIN
  • API_NAME
  • API_STRICT
  • API_DEBUG

接下來 針對以上配置一一作出解釋:

  1. API_STANDARDS_TREE : 有三個可選值:
    • x : 本地開發的或私有環境的
    • prs : 主要用於非商業銷售的項目,未對外發佈
    • vnd :對外公開,所有用戶可以訪問
  2. API_SUBTYPE :項目的簡稱,或者項目名稱
  3. API_VERSION : 版本號
  4. API_PREFIXAPI_DOMAIN : 前綴和子域名, 前綴或子域名是必須的,並且同時只有一個
  5. API_NAME : API的名字只有在使用API Blueprint命令生成文檔的時候才用到,這個名字作為默認名字以免生成文檔時需要手動指定名字。
  6. API_STRICT : 嚴格解析,值為 true 或 false,默認為 false ,開啟嚴格解析,意味着你不可以使用瀏覽器來進行訪問。
  7. API_DEBUG deuug 模式,方便查看錯誤信息

其他還有一些,分別為響應格式、錯誤格式、認證等等,就不一一介紹了。

我們打開 .env 文件,配置剛才所說的參數

API_STANDARDS_TREE=x  API_SUBTYPE=laravel-api  API_PREFIX=api  API_VERSION=v1  API_DEBUG=true

3. 編寫測試接口

我們知道 laravel 路由文件 有專門的api 路由文件。打開該文件

<?php    use IlluminateHttpRequest;    /*  |--------------------------------------------------------------------------  | API Routes  |--------------------------------------------------------------------------  |  | Here is where you can register API routes for your application. These  | routes are loaded by the RouteServiceProvider within a group which  | is assigned the "api" middleware group. Enjoy building your API!  |  */    Route::middleware('auth:api')->get('/user', function (Request $request) {      return $request->user();  });

由於我們使用 DingoApi ,因此我們同樣使用 DingoApi 的路由。將內容全部替換 如下內容:

<?php  use IlluminateHttpRequest;    $api = app('DingoApiRoutingRouter');  $api->version('v1', function($api) {      $api->get('test', function() {          return response('hello word');      });  });

使用接口調試工具 來進行測試 推薦使用 POSTMAN 調試工具,

  1. 網址中輸入地址 http://laravel-api.test/api/test ,不出意外 應該會輸出 hello world 字樣
  2. 另外一種很常見的訪問方式是通過 Accept 添加頭信息 Headers

Accept: application/x.laravel-api.v1+json

似乎很難看出效果,我們新增一條路由試試。

.  .  .  $api->version('v2', function($api) {      $api->get('test', function() {          return response('hello laravel');      });  });

接着改變 Accept

Accept: application/x.laravel-api.v2+json

ok,以上我們僅僅是測試我們的接口是不是可以正常用心,實際項目中,我們不可能所有的代碼都放在路由文件中。接下來,我們新建控制器來替換路由的示例代碼。

首先,我們新建一個基類控制器,讓我們的所有其他控制器,默認繼承我們新建的控制器。

php artisan make:controller Api/v1/Controller    php artisan make:controller Api/v2/Controller

我們引入 DingoApi的 Helpers 來處理有關接口的響應

可以看出,我們在 appHttpControllers 新建了一個文件夾 Api ,同時在此目錄下又新建了 v1v2目錄

新建 Api 目錄,我們是為了和其他 web 控制器區分,我們將所有有關接口的控制器都放到Api 目錄下.增加 v1v2 我們是為了後續的版本管理

打開這兩個控制器, 替換如下代碼:

<?php    namespace AppHttpControllersApiv1;    use DingoApiRoutingHelpers;  use IlluminateHttpRequest;  use AppHttpControllersController as BaseController;    class Controller extends BaseController  {      use Helpers;  }

同理:v2 下也是這樣修改 (注意命名空間,不要全部複製,記得修改哦)。

新增控制器,比如我們添加一個 Users 控制器

php artisan make:controller Api/v1/UsersController    php artisan make:controller Api/v2/UsersController

打開新建的 UsersController,替換成如下代碼:

<?php    namespace AppHttpControllersApiv1;    use IlluminateHttpRequest;    class UsersController extends Controller  {      public function store()      {          return $this->response->array(['errmsg' => 'this is v1']);      }  }

v2 下我們稍微改變下返回數據,以便直觀看出

<?php    namespace AppHttpControllersApiv2;    use IlluminateHttpRequest;    class UsersController extends Controller  {      public function store()      {          return $this->response->array(['errmsg' => 'this is v2']);      }  }

控制器就算完成了,我們添加兩條路由。

.  .  .  $api->version('v1', [      'namespace' => 'AppHttpControllersApiv1'  ], function($api) {      $api->post('users', 'UsersController@store')          ->name('api.v1.users.store');  });    $api->version('v2', [      'namespace' => 'AppHttpControllersApiv2'  ], function($api) {      $api->post('users', 'UsersController@store')          ->name('api.v2.users.store');  });

增加了一個 namespace 參數,目的是所有路由都會指向 該 namespace

訪問方法和上面一樣。

ok,以上就是 laravel 中初步安裝 DingoApi ,並且配置的基礎教程,更多使用請閱讀 官方文檔