欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解

Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解

熱門標簽:重慶外呼電銷系統多少錢 辦理400電話哪家好點 南京3D地圖標注 南寧電話外呼系統線路 邢臺400電話辦理 嘟嘟云外呼系統 正規電銷機器人系統 濟源百應電銷機器人聯系方式 咸陽電銷

從Laravel 5.5+開始,加入了API Resources這個概念。

我們先來看一下官網如何定義這個概念的:

When building an API, you may need a transformation layer that sits between your Eloquent models and the JSON responses that are actually returned to your application's users. Laravel's resource classes allow you to expressively and easily transform your models and model collections into JSON.

可能看完這個概念之后,你仍然有點不明白,畢竟這個定義說的有點含糊。

如果你熟悉使用API進行輸出,構架前后端分離的網絡應用,那么你應該會發現,當我們使用Eloquent從數據庫中取出數據后,如果想以JSON格式進行輸出,那么我們可以使用->toJson()這個方法,這個方法可以直接將我們的model序列化(這個方法從Laravel 5.1+開始就可以使用了):

$user = App\User::find(1);

return $user->toJson();

使用多了,我們會發現,在model較為復雜,或者model中有很多我們API輸出可能用不到的字段的情況下,toJson()仍然會忠實地幫我們把這些字段序列化出來。

這個時候,我們會想,如何將model中的某些字段隱藏起來,不輸出到JSON中。另外一種情況,比如字段是password等一些敏感信息的時候,我們不希望JSON數據里包含這樣的敏感信息。

要解決這個問題,我們可以在model里定義$hidden或者$visible這兩個數組來進行字段的隱藏或者顯示:

?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  /**
   * 不希望在序列化中出現的字段放入該數組中
   * 
   * @var array
   */
  protected $hidden = ['password', 'some', 'secret'];
}
?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  /**
   * 只有在以下數組中出現的字段會被序列化
   *
   * @var array
   */
  protected $visible = ['first_name', 'last_name'];
}

那么你可能會想,我們已經有了可以自動序列化的方法,以及可以隱藏或者顯示指定字段的方法,這樣不就足夠了嗎?

現在我們來假設一個簡單的應用場景。假設我們在輸出一個客戶列表,里面包含了客戶名字和送貨地址。我們使用Customer這個model定義客戶,使用ShippingAddress這個model進行定義送貨地址。為了簡化場景,我們的客戶只有一個送貨地址,所以只會出現一一對應的情況。

那么在ShippingAddress對應的數據庫表shipping_addresses中,我們可能會有如下定義:

| id | country_id | province_id | city_id | address |

字段類型我就不贅述了,其中country_id、province_id以及city_id這三個外鍵分別對應了國家、省份以及城市表中的id。

而Customer對應的customers表中,會有shipping_address_id這個外鍵指向shipping_addresses表中的id。

那么我們要輸出顧客和送貨地址,我們需要先在model中定義好relationship:

?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
  public function shippingAddress()
  {
    return $this->belongsTo(ShippingAddress::class);
  }
}
?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ShippingAddress extends Model
{
  public function country()
  {
    return $this->belongsTo(Country::class);
  }
  
  public function province()
  {
    return $this->belongsTo(Province::class);
  }
  
  public function city()
  {
    return $this->belongsTo(City::class);
  }
}

在我們的控制器中,我們拉取出所有客戶:

?php

namespace App\Http\Controllers;

use App\Customer;
use App\Http\Controllers\Controller;

class CustomerController extends Controller
{
  /**
   * Simple function to fetch all customers with their shipping addresses
   *
   * @return String
   */
  public function index()
  {
    $customers = Customer::with(['shippingAddress', 'shippingAddress.country', 'shippingAddress.province', 'shippingAddress.city'])->get();
    
    //這里可以直接返回Eloquent Collections或Objects,toJson()將自動被調用
    return $customers;
  }
}

那么輸出的JSON將會包含了多個層級的關系,那么在我們前端調用的時候,將會非常麻煩,因為我們需要一層一層剝開Object關系。

但是如果你熟悉Laravel,你可能會說,慢著!這個情況我可以用accessor不就完事兒了嗎?

是的,我們確實可以使用accessor來簡化我們的數據層級:

/**
 * Get the customer's full shipping address
 *
 * @return string
 */
public function getFullShippingAddressAttribute()
{
  return "{$this->shippingAddress->country->name} {$this->shippingAddress->province->name} {$this->shippingAddress->city->name} {$this->shippingAddress->address}";
}

但是我們還需要一步操作。由于customers這張表本身沒有full_shipping_address這個字段,要使我們的JSON輸出包含full_shipping_address,我們需要添加$appends數組:

?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
  /**
   * The accessors to append to the model's array form.
   *
   * @var array
   */
  protected $appends = ['full_shipping_address'];
}

對于每一個我們想自定義的JSON字段,我們都需要進行上面兩部的操作。這樣一來其實非常麻煩,并且不利于代碼的維護,因為這會讓原本簡潔的model顯得很復雜。

基于以上原因,我們需要一個中間層,在我們輸出model成為JSON的時候,可以進行一次信息的過濾及加工。

那么還是使用我們上面的應用場景。要輸出自定義的字段再簡單不過了。我們不需要在model里定義各種accessor,也不需要使用黑白名單過濾字段,只需要新建一個Resource類:

$ php artisan make:resource Customer

然后我們可以看到,在app/Http文件夾下,多出了一個名為Resources文件夾下,其中含有一個名為Customer.php的文件:

?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Customer extends JsonResource
{
  /**
   * Transform the resource into an array.
   *
   * @param \Illuminate\Http\Request $request
   * @return array
   */
  public function toArray($request)
  {
    return parent::toArray($request);
  }
}

這里我們看到其中有且僅有一個名為toArray的方法。這就是我們要自定字段的地方:

 public function toArray($request)
  {
    return [
      'fullName' => $this->first_name . $this->last_name,
      'fullShippingAddress'  => $this->shippingAddress->country->name . $this->shippingAddress->province->name . $this->shippingAddress->city->name . $this->shippingAddress->address,
    ];
  }

注意到,無論是fullName還是fullShippingAddress,都是不存在于customers表中的字段。

接著,我們只需要簡單修改一下我們的控制器:

?php

namespace App\Http\Controllers;

use App\Customer;
use App\Http\Resources\Customer as CustomerResource;
use App\Http\Controllers\Controller;

class CustomerController extends Controller
{
  /**
   * Simple function to fetch all customers with their shipping addresses
   *
   * @return String
   */
  public function index()
  {
    $customers = Customer::with(['shippingAddress', 'shippingAddress.country', 'shippingAddress.province', 'shippingAddress.city'])->get();
    
    //這里我們使用了新的Resource類
    return CustomerResource::collection($customers);
  }
}

這樣就OK了!我們輸出的JSON數據中,將會僅僅含有以上兩個字段,即fullName和fullShippingAddress,非常干凈,并且前端直接可用,不需要二次再加工。

唯一需要注意的是,這里由于我們拉取了多個Customer,所以我們用了每個Resource類都自帶有的collection方法,將一個Collection中的所有對象都進行處理。而若要處理單個對象,我們需要使用以下代碼:

public function show($id)
{
  $customer = Customer::findOrFail($id);
  return new CustomerResource($customer);
}

要了解更多關于API Resources的詳情,請戳官網文檔:

https://laravel.com/docs/5.7/eloquent-resources

本文主要講解了Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解,更多關于Laravel框架的使用技巧請查看下面的相關鏈接

您可能感興趣的文章:
  • Laravel如何實現適合Api的異常處理響應格式
  • laravel接管Dingo-api和默認的錯誤處理方式
  • 在Laravel中使用GuzzleHttp調用第三方服務的API接口代碼
  • Laravel實現ApiToken認證請求
  • laravel框架 api自定義全局異常處理方法
  • laravel dingo API返回自定義錯誤信息的實例
  • laravel 配置路由 api和web定義的路由的區別詳解
  • Laravel5.4簡單實現app接口Api Token認證方法
  • 詳解Laravel制作API接口

標簽:黃山 唐山 河南 南通 武漢 平頂山 通遼 隴南

巨人網絡通訊聲明:本文標題《Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解》,本文關鍵詞  Laravel5.5+,使用,API,Resources,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解》相關的同類信息!
  • 本頁收集關于Laravel5.5+ 使用API Resources快速輸出自定義JSON方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日韩一本二本av| 精品一区在线观看视频| 秋霞电影网一区二区| 国产精品不卡一区| 国内精品久久久久影院色| 亚洲av无码一区二区三区观看| 日日骚一区二区三区| 国产精品另类一区| 成人涩涩免费视频| 蜜臀久久精品久久久用户群体| 国产午夜一区二区三区| 国内精品视频一区二区三区八戒| 蜜桃av免费看| 久久综合色8888| 韩国女主播成人在线观看| 精品人伦一区二区| 久久久久综合网| 国产一区视频网站| 免费黄色激情视频| 国产精品狼人久久影院观看方式| 国产ts人妖一区二区| 天天天天天天天天操| 18涩涩午夜精品.www| 95精品视频在线| 在线观看日产精品| 亚洲一区二三区| 伊人久久久久久久久| 7777精品久久久大香线蕉 | 久久综合狠狠综合久久激情| 久久国内精品自在自线400部| 国产成人精品无码免费看夜聊软件| 精品国产乱子伦一区| 国产一区二区三区蝌蚪| 色哟哟一一国产精品| 成人欧美一区二区三区视频网页| 91在线视频官网| 国产成人在线免费| 在线免费播放av| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美videossexotv100| 日本亚洲视频在线| 黄免费在线观看| 26uuu另类欧美| 岛国av在线一区| 欧美伊人久久久久久午夜久久久久| 亚洲国产视频一区二区| 30一40一50老女人毛片| 欧美韩国一区二区| 91日韩在线专区| 日韩一级片在线观看| 激情六月婷婷久久| 三级av在线免费观看| 亚洲自拍偷拍欧美| av女人的天堂| 日韩毛片高清在线播放| 性色av蜜臀av浪潮av老女人| 精品国产乱码久久久久久免费 | 日韩一区二区免费高清| 国产一区999| 欧美丝袜自拍制服另类| 免费看欧美美女黄的网站| 一级免费黄色录像| 亚洲高清视频在线| 又色又爽的视频| 亚洲午夜av在线| 国产精品久久久久久成人| 亚洲精品中文字幕乱码三区| 中文字幕av网址| 日本黄色免费片| 91精品国产色综合久久不卡电影| 精品一区二区国语对白| 在线观看av一区二区| 久久精品国产在热久久| 91精品福利视频| 九九精品视频在线看| 欧美性xxxxx极品少妇| 国产制服丝袜一区| 欧美三级蜜桃2在线观看| 国产在线国偷精品产拍免费yy| 精品视频1区2区| 国产精品一区二区不卡| 欧美高清视频一二三区| 成人夜色视频网站在线观看| 日韩精品在线看片z| 91一区在线观看| 国产亚洲美州欧州综合国| 爱情岛论坛亚洲自拍| 国产欧美视频一区二区| 精人妻一区二区三区| 国产精品久久久久久亚洲毛片 | 亚洲精品成人精品456| 婷婷色一区二区三区| 亚洲影视在线观看| 暗呦丨小u女国产精品| 久久99精品久久久久久国产越南| 欧美色图在线观看| 成人毛片老司机大片| 精品乱人伦小说| av电影天堂一区二区在线观看| 久久尤物电影视频在线观看| 日本50路肥熟bbw| 中文字幕日韩一区二区| 99国产精品免费| 亚洲成人av一区二区| 色中色一区二区| 国产麻豆视频精品| 日韩精品最新网址| 69av一区二区三区| 91免费看片在线观看| 国产精品乱码妇女bbbb| 制服丨自拍丨欧美丨动漫丨| 久久国产尿小便嘘嘘| 在线综合+亚洲+欧美中文字幕| 93久久精品日日躁夜夜躁欧美| 国产精品毛片a∨一区二区三区| 成人黄色a级片| 日日夜夜一区二区| 欧美色综合影院| 中文字幕无码毛片免费看| 国产精品高潮呻吟久久| 熟女少妇内射日韩亚洲| 麻豆免费精品视频| 欧美一级黄色片| av黄色一级片| 视频一区二区欧美| 在线播放中文一区| 黄页网站在线看| 亚洲激情网站免费观看| 色老汉av一区二区三区| 福利一区二区在线| 国产精品久久久久久久久久久免费看| 中文字幕第4页| 久久99久久久欧美国产| 欧美成人艳星乳罩| 亚洲理论片在线观看| 精品在线免费观看| 久久精品欧美一区二区三区麻豆| 人人妻人人澡人人爽| 国产一区二区免费在线| 国产欧美1区2区3区| 黑人操日本美女| 波多野结衣一区二区三区| 亚洲日本乱码在线观看| 欧洲av一区二区嗯嗯嗯啊| 91美女蜜桃在线| 亚洲成人动漫在线免费观看| 69堂成人精品免费视频| 一本加勒比北条麻妃| 国内成人免费视频| 欧美激情在线看| 久久中文免费视频| 99久久综合精品| 亚洲一区二区成人在线观看| 国产成人免费在线观看| 欧美日韩亚洲综合| 欧美深性狂猛ⅹxxx深喉| 麻豆91精品91久久久的内涵| 久久久久97国产精华液好用吗| 五月婷婷综合激情网| 99热这里都是精品| 亚洲123区在线观看| 欧美草草影院在线视频| 亚洲熟女少妇一区二区| a在线播放不卡| 亚洲第一电影网| 精品国产一区二区精华| 亚洲熟女少妇一区二区| 中文字幕乱码在线人视频| 婷婷成人综合网| 久久久国产精品午夜一区ai换脸| 2014亚洲天堂| 91精品人妻一区二区三区四区| 日韩国产在线观看一区| 欧美肥妇free| 国产第一页精品| 亚洲av无码久久精品色欲| 日本欧美加勒比视频| 日本一区二区免费在线观看视频 | 色香蕉久久蜜桃| 久草视频福利在线| 国产真实乱对白精彩久久| 亚洲另类在线制服丝袜| 欧美大胆一级视频| 色综合久久久网| 好吊日免费视频| 成人免费高清视频在线观看| 日韩电影免费在线观看网站| 亚洲精品一区二区三区四区高清| 91精品福利在线| аⅴ天堂中文在线网| 熟妇女人妻丰满少妇中文字幕| 国产综合一区二区| 亚洲一二三区视频在线观看| 国产午夜精品一区二区| 欧美日本国产视频| 久久人妻无码aⅴ毛片a片app| www.免费av| 99久久久久久| 久久99蜜桃精品| 亚洲成年人影院|