API 資源和 API 資源集合的輔助修改

houxin發表於2018-12-25

前幾日詢問了關於api資源的一些雞肋的詢問,貌似並未得到有價值的結果。以下是連結:
問答:大家有沒有覺得 API 資源和 API 資源集合是雞肋一樣的存在

本來算放棄,只用最原始的函式封裝的辦法來做呢,但是每每想到這裡,心裡總是有個梗。於是,經過昨晚的認真分析。寫出來下面兩個關於資源的類的方法。一個是api資源,一個是api資源類。
實現的主要功能
1、api資源和api資源集合的後設資料返回值的封裝
2、api資源和api資源集合的輸出的資料篩選
篩選提供兩種方式,選擇和排除。
此舉僅僅是拋磚引玉之作,還有大家積極貢獻自己的好辦法。

api資源

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class CourseResource extends JsonResource
{
    // 定義符合的欄位的輸出列表
    protected $only = ['id', 'title', 'price'];
    // 定義需要排除的欄位列表
    protected $except = ['deleted_at', 'created_at', 'updated_at'];

    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return resource_data($this->selectField($this->resource, 'only'));
    }
    /*
     * 處理欄位的篩選符合的內容
     * 如果是陣列需要對欄位帥選的話 可以這麼用
     */
    private function selectField($data, $type){
        // 選擇合適結果集
        $field = $this->$type;
        // 使用欄位篩選出符合的欄位
        return collect($data)->$type($field);
    }
}

api資源集合

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class CourseCollection extends ResourceCollection
{
    // 定義符合的欄位的輸出列表
    protected $only = ['id', 'title', 'price'];
    // 定義需要排除的欄位列表
    protected $except = ['deleted_at', 'created_at', 'updated_at'];
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        // 對返回值記性帥選處理
        return resource_data($this->selectField($this->collection, 'except'));
    }
    /*
     * 處理欄位的篩選符合的內容
     * 如果是陣列需要對欄位帥選的話 可以這麼用
     */
    private function selectField($data, $type){
        // 對陣列進行迴圈的處理
        $field = $this->$type;
        return $data->map(function($item) use($type, $field){
            return collect($item)->$type($field);
        });
    }
}

api返回方法封裝

/*
 * 設定固定的返回值的格式
 * $data  為返回的資料
 * $code  為返回的狀態碼
 * $msg   為返回的資訊
 * $jsonp 是否設定為跨域訪問
 */
function resource_data($data=[], $code=200, $msg='success'){
    return [
        'code' => $code,
        'msg' => $msg,
        'data' => $data
    ];
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章