婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    av午夜一区麻豆| 日韩美女视频一区二区| 美女一区二区三区| 国产精品蜜臀在线观看| 91精品一区二区三区久久久久久 | 成人视屏免费看| 久久精工是国产品牌吗| 视频在线观看一区二区三区| 自拍偷在线精品自拍偷无码专区 | 国产精品夜夜嗨| 久久国产三级精品| 久久精品国产99久久6| 美女尤物国产一区| 精品亚洲成a人| 极品美女销魂一区二区三区免费 | 大美女一区二区三区| 精品一区二区三区免费视频| 理论电影国产精品| 久久精品久久精品| 国产成人8x视频一区二区| 国产精品18久久久久| 国产精品一二三| 色综合久久综合网欧美综合网 | 99在线视频精品| 成人黄页毛片网站| 91一区二区在线| 欧美综合在线视频| 欧美亚洲综合在线| 在线电影一区二区三区| 欧美一区在线视频| 欧美电影免费观看高清完整版在| 精品电影一区二区| 国产网红主播福利一区二区| 欧美经典一区二区| 亚洲美女淫视频| 日本不卡一区二区三区高清视频| 久久精品二区亚洲w码| 成人性生交大片免费看在线播放| 99久久99久久久精品齐齐| 在线视频亚洲一区| 日韩视频免费直播| 国产亲近乱来精品视频| 亚洲美女一区二区三区| 日韩高清在线一区| 丁香啪啪综合成人亚洲小说 | 日韩视频在线永久播放| 精品久久国产字幕高潮| 日本一二三不卡| 亚洲第一激情av| 韩国一区二区在线观看| 91成人在线精品| 欧美精品一区二区三区蜜桃| 国产精品美日韩| 琪琪久久久久日韩精品| 99r精品视频| 久久伊人中文字幕| 亚洲自拍欧美精品| 粉嫩高潮美女一区二区三区 | 不卡av电影在线播放| 欧美精品一级二级| 国产午夜精品美女毛片视频| 亚洲一区二区三区激情| 成人h精品动漫一区二区三区| 日韩一区二区三区电影| 亚洲天堂福利av| 国产精品资源在线观看| 欧美精品一卡二卡| 一区二区三区四区五区视频在线观看| 国产一区二区三区在线观看精品 | 国产精品色噜噜| 理论电影国产精品| 欧美日韩国产美| 尤物av一区二区| 成人av网站免费| 国产日韩欧美在线一区| 毛片av一区二区| 欧美群妇大交群中文字幕| 一区在线中文字幕| 成人禁用看黄a在线| 国产午夜精品久久久久久久| 久久66热re国产| 日韩天堂在线观看| 视频一区视频二区中文字幕| 欧洲av一区二区嗯嗯嗯啊| ...av二区三区久久精品| 国产精品中文字幕欧美| 欧美成人高清电影在线| 久久不见久久见免费视频7| 91精品国产综合久久久久久久 | 粉嫩高潮美女一区二区三区| 久久先锋资源网| 国产乱一区二区| 日韩免费视频一区| 久久精品国内一区二区三区| 日韩一区二区三区高清免费看看| www.成人网.com| 久久久亚洲高清| 国产成人午夜精品5599| 国产午夜精品久久久久久免费视| 国产乱人伦偷精品视频免下载 | 欧美人与z0zoxxxx视频| 亚洲成人av在线电影| 欧美午夜精品免费| 日韩精品乱码免费| 精品福利在线导航| 成人91在线观看| 亚洲国产中文字幕| 欧美一区二区在线观看| 久久99热狠狠色一区二区| 精品国产乱码久久久久久老虎| 国产美女在线精品| 中文字幕乱码亚洲精品一区| 99国产精品久久久久久久久久久| 夜夜揉揉日日人人青青一国产精品| 欧美另类z0zxhd电影| 久久激情综合网| 国产精品色噜噜| 欧美美女激情18p| 韩国av一区二区三区| 国产精品热久久久久夜色精品三区| 色狠狠一区二区| 久久99精品国产.久久久久久| 国产婷婷色一区二区三区四区 | 精品精品欲导航| 懂色av一区二区三区免费观看| 亚洲色图欧美在线| 欧美一区二区不卡视频| 国产不卡视频在线观看| 亚洲成人自拍偷拍| 中文字幕欧美国产| 51精品国自产在线| av在线播放一区二区三区| 亚瑟在线精品视频| 日本一区二区三区久久久久久久久不| 91热门视频在线观看| 久久国产成人午夜av影院| 亚洲欧洲av另类| 精品成人免费观看| 色菇凉天天综合网| 高清成人免费视频| 日本不卡123| 亚洲最色的网站| 国产精品每日更新在线播放网址| 欧美一区二区视频网站| 97久久久精品综合88久久| 五月天视频一区| 国产精品不卡一区二区三区| 日韩欧美第一区| 5858s免费视频成人| 欧美性三三影院| 99国产精品国产精品毛片| 狠狠色狠狠色综合日日91app| 亚洲成人av电影| 亚洲一区二区不卡免费| 综合久久久久综合| 2017欧美狠狠色| 91精品欧美久久久久久动漫| 国产主播一区二区| 日本韩国精品在线| 国产在线精品一区二区| 日本怡春院一区二区| 亚洲综合色成人| 日韩一区在线播放| 亚洲国产成人在线| 国产嫩草影院久久久久| 日韩欧美一级在线播放| 67194成人在线观看| 6080午夜不卡| 在线观看网站黄不卡| 大白屁股一区二区视频| 麻豆精品新av中文字幕| 午夜精品久久久久久| 一区av在线播放| 亚洲视频综合在线| 亚洲男同性视频| 亚洲一区二区精品久久av| 国产精品热久久久久夜色精品三区 | 香蕉久久夜色精品国产使用方法 | 国产精品中文字幕日韩精品| 久久se精品一区二区| 另类小说欧美激情| 激情综合色丁香一区二区| 毛片一区二区三区| 国精品**一区二区三区在线蜜桃| 久久精品国产精品亚洲红杏 | 一区二区视频在线看| 亚洲综合色噜噜狠狠| 日韩成人一级大片| 久久精品国产色蜜蜜麻豆| 国产美女视频一区| 不卡一二三区首页| 欧美性受极品xxxx喷水| 日韩一区二区三区精品视频| 久久亚洲精品小早川怜子| 国产精品无人区| 五月天激情小说综合| 久久99久久精品欧美| 成人一级片网址| 欧美精品乱码久久久久久| 久久天天做天天爱综合色|