laravel和dingoapi的結合使用


dingoapi是一個laravel的開源插件,可以在github上搜索到,現在在做一個項目,項目中總是會有后端跟前端的json數據交互,而這個dingoapi為json交互提供了很大的便利。

先安裝dingoapi

1、在composer.json中的require中添加"dingo/api": "1.0.*@dev",然后在項目根目錄運行composer update

注意:dingoapi如果直接用composer require dingo/api:1.0.x@dev的方式安裝是安裝不成功的,

因為這個包作者本人還是將其設置為開發中,非穩定版,但是實際上這個包經過驗證是穩定的,已經有4500+的star了。

2、在config/app.php中注冊服務提供者到providers

Dingo\Api\Provider\LaravelServiceProvider::class,

3、生成dingoapi的配置文件

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

會在config文件夾里生成api.php這個配置文件

4、將api.php中的prefix默認值設置為api,也可以不是api,但是必須要有個后綴,后綴不要設置為"/",如果設置為"/",laravel的視圖跟api會弄混淆,比如,在laravel中自定義了一個404錯誤頁面,如果這里設置為"/"的話,訪問不存在的頁面的時候,會返回格式為json的錯誤信息,因為dingapi就是做接口用的,不管什么都會被轉為json。

那如果想把視圖跟api區分開來,路由文件需要這么寫,以下是例子:

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/
Route::post('/test','AdminController@test');
Route::post('/hook','HookController@hook');
#后台管理系統登錄視圖
Route::get('/admin','AdminController@loginView');
Route::get('/admin/login','AdminController@loginView');
#后台管理系統登錄api
Route::post('/admin/login','AdminController@login');
#退出登錄api
Route::get('/logout','UserController@logout');
#管理員可見視圖
Route::group(['middleware' => ['role:admin']], function () {
    #用戶列表視圖
    Route::get('/users','AdminController@users');
    #添加用戶視圖
    Route::get('/add_user','AdminController@addUserView');
    #機修列表視圖
    Route::get('/mechanics_list','MechanicsController@dataList'); 
    #配件列表視圖
    Route::get('/parts_list','PartsController@dataList'); 
    #添加配件視圖
    Route::get('/add_part','PartsController@addView');
    Route::match(['get','post'],'/mechanics_add', 'MechanicsController@add');
    Route::get('/edit_user/{id}','AdminController@editUserView');
    Route::get('/video',function(){
        return view('video',['title'=>"視頻播放"]);
    });
});


$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
    $api->group(['namespace' => 'App\Http\Controllers\Api'], function ($api) {
//namespace聲明路由組的命名空間,因為上面設置了"prefix"=>"api",所以以下路由都要加一個api前綴,比如請求/api/users_list才能訪問到用戶列表接口
$api->group(['middleware'=>['role:admin']], function ($api) { #管理員可用接口 #用戶列表api $api->get('/users_list','AdminApiController@usersList'); #添加用戶api $api->post('/add_user','AdminApiController@addUser'); #編輯用戶api $api->post('/edit_user','AdminApiController@editUser'); #刪除用戶api $api->post('/del_user','AdminApiController@delUser'); #上傳頭像api $api->post('/upload_avatar','UserApiController@uploadAvatar'); }); }); });

 

需要新建一個BaseController:

<?php

namespace App\Http\Controllers\Api;

use Dingo\Api\Routing\Helpers;
use App\Http\Controllers\Controller;

class BaseController extends Controller
{
    use Helpers;
}

然后做接口的控制器都繼承這個BaseController

這些做接口的控制器放Api文件夾里

然后如果用了Requests做驗證,需要將原本request里的use Illuminate\Foundation\Http\FormRequest換成use Dingo\Api\Http\FormRequest;

不然的話不能明確的顯示驗證錯誤的消息。

以下是我用到dingoapi的一些功能:

第一個功能:

當我用jquery的ajax請求服務器的數據的時候,ajax其實有兩個參數,success的回調函數和error的回調函數,在laravel中,如果我直接return響應一個數組,laravel框架會自動的將這個數組變成json格式的響應,所以我在laravel代碼寫類似下面的代碼:

if($error){
    return ['status'=>'error',''=>'message'=>'未通過驗證'];    //返回200響應碼,但是返回status為error的標識

}
return ['status'=>'success',''=>'message'=>'操作成功'];      //返回200響應碼,並且返回status為success的標識

這個時候前端jquery的success的回調函數可以根據status這個標識來判斷操作是否成功:

dataType:'json',          //注意這里要寫json,標識服務器返回的是json,jquery會將這個json字符串轉化為json對象方便下面獲取數據
success:function(res){
     if(res.status == 'error'){
    alert(res.message);    //這里會alert一個“未通過驗證”
   }
   else{
     alert(res.message);   //這里會alert一個“操作成功”
   }

}

這樣是一種前端跟后端傳遞數據的方法,不管操作成功或者失敗都返回200的正確響應,根據status來判斷操作成功或者失敗。

 

如果我使用dingoapi的話,dingoapi可以既返回異常又返回json數據(如果不使用dingoapi,返回異常的話會返回一個異常的html頁面)。

 

所以就可以用jquery的ajax的error回調函數來肯定操作失敗的行為:

dataType:json,

error:function(error){

  alert($.parseJSON(error.responseText));    //parseJSON方法將json字符串轉化為json對象

}

    這里是laravel控制器中的一個方法。

        這里是ajax的error回調函數

這里是瀏覽器的控制台

 


看完效果以后便知道為什么要用parseJSON將json字符串轉化為json對象了,因為responseText的屬性是一個json格式的字符串,但不是對象。

轉化為對象以后變會輸出錯誤消息。

第二個功能:

使用dingoapi的tranform

app\Http\Transformers下新建一個UserTransformer.php文件(這個Transformers文件夾也是新建的):

<?php

namespace App\Http\Transformers;

use App\Models\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{

    protected $availableIncludes = [];
    protected $defaultIncludes = [];

    public function transform(User $item)
    {
        return [
                'id' => $item->id,
                'name' => $item->name,
                'sex' => $item->sex,
                'telphone' => $item->telphone,
                'car_company'=>isset($item->car->car_company) ? $item->car->car_company : '',
                'license_plate'=>isset($item->car->license_plate) ? $item->car->license_plate : '',
                'birthday' => $item->birthday,
                'created_at'=>(string)$item->created_at,
                'first_time'=>isset($item->car->first_time) ? $item->car->first_time : '',
                'integral'=>$item->integral,
        ];
    }

}

 

這樣定義以后,在控制中

 

 
         

<?php

 
         

namespace App\Http\Controllers\Api;

use App\Models\User;

use App\Http\Transformers\UserTransformer;

class UserApiController extends BaseController  //這里繼承BaseController

{

  public function users(){  

    $user->all();    //這里也可以寫成一些where條件
    return $this->response->collection($user, new UserTransformer);

  }

}

 
        

 

這就會把$user里其他的字段全部過濾掉,這么寫的話非常有規范性,控制器中就不用寫太多的數據轉化了。

當然如果非要在控制中實現過濾數組的話,可以使用以下常用函數:

array_filter($arr)  

參數是一個數組,實現過濾鍵值為空的數組元素

array_only($arr,$key) 參數是數組,只保留參數數組中的鍵,其余的全部過濾掉

array_except($arr,$key)參數是數組,除了參數$key數組以外的鍵,其余的全部過濾掉

 

當然,dingoapi的功能肯定不只這兩個,還有很多,我會慢慢在使用中做筆記。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM