Laravel 5-分形变压器-向变压器发送参数以缩小响应范围


Laravel 5 - fractal transformers - Sending parameters to the transformer to narrow down response

所以我有一个名为VIP的模型,它有很多相关信息。因此,当我们走到路线vip/{id}时,我会返回大部分信息。然而,当我转到vips/{per-page}时,我不想返回所有数据,因为API将以指数级速度减慢。相反,我宁愿退回一些更基本的东西。

为了做到这一点,我有一个Transformer,它在顶部创建基本响应,然后进入下面一些更复杂的关联,然后返回全部。如果为true,我想向transformer发送某种只返回基本响应的标志。然而,我正在使用分形,似乎无法找到将此标志发送到转换器的方法。

VipsController@index:

   /**
     * Display a listing of the resource.
     *
     * @return 'Illuminate'Http'Response
     */
    public function index(Request $request, $perPage = 15)
    {
        $page = $request->input('page');
        $vip = Cache::tags(['vips'])->remember("vip.index.$perPage.$page", 60, function() use ($perPage){
            Log::info('getting data from the database');
            return $this->vip->paginate($perPage, ['*'], ['gender','status','local','jobClass','nonMember','initiationDate','pensioner']);
        });
        return $this->fractal->paginatedCollection($vip, new VipTransformer());
    }

VipTransformer@transform:

    public function transform(Vip $vip)
    {
        $response = [
            'id' => $vip->vip_id,
            'first_name' => isset($vip->first_name) ? $vip->first_name : '',
            'last_name' => isset($vip->last_name) ? $vip->last_name : '',
            'birth_date' => isset($vip->birth_date) ? $vip->birth_date : '',
            'deceased_date' => isset($vip->deceased_date) ? $vip->deceased_date : '',
            'divorced_date' => isset($vip->divorced_date) ? $vip->divorced_date : '',
            'marriage_date' => isset($vip->marriage_date) ? $vip->marriage_date : '',
            'initiation_date' => isset($vip->initiationDate->date_value) ? $vip->initiationDate->date_value : '0000-00-00',
            'gender' => isset($vip->gender->code_description) ? $vip->gender->code_description : '',
            'status' => isset($vip->status->code_description) ? $vip->status->code_description : '',
            'local' => isset($vip->local) ? "{$vip->local->local_code} - {$vip->local->local_name}" : '',
            'jobClass' => isset($vip->jobClass) ? $vip->jobClass->code_description : '',
            'nonMember' => isset($vip->nonMember) ? $vip->nonMember->code_description : '',
            'age' => isset($vip->birth_date) && $vip->birth_date !== '0000-00-00' ? Carbon::parse($vip->birth_date)->age : 0,
        ];
        // Grab retirement date from pension tables
        $response['retirement_date'] = $vip->pensioner->retirement_date ?? '0000-00-00';
        // Grab the associated information for the vip profile
        $reciprocals = [];
        $addresses = [];
        $phone_numbers = [];
        $emails = [];
        foreach($vip->addresses as $address) {
            $addresses = [
                'address1' => $address->address_1 ?? '',
                'address2' => $address->address_2 ?? '',
                'city' => $address->city ?? '',
                'zip' => $address->zip_code ?? '',
                'country' => $address->country->code ?? '',
                'state' => $address->state->state_province_code ?? '',
                'is_default' => $address->is_default ?? false,
            ];
        }
        // TODO: Add record status trait to each
        foreach ($vip->phones as $phone) {
            $phone_numbers[] = [
                'extension' => $phone->extension ?? '',
                'number' => $phone->phone_number ?? '',
                'is_default' => $phone->is_default ?? false,
            ];
        }
        foreach ($vip->emails as $email) {
            $emails[] = [
                'email_address' => $email->email_address ?? '',
                'is_default' => $email->is_default ?? false,
            ];
        }
        foreach ($vip->reciprocalMembers as $member) {
            $reciprocals[] = $member->effective_date . ' - ' . $member->fund->fund_abbreviation . ' - ' . $vip->local->local_name;
        }
        $response['addresses'] = $addresses;
        $response['phone_numbers'] = $phone_numbers;
        $response['emails'] = $emails;
        $response['reciprocals'] = $reciprocals;

        return $response;
    }

有没有一种方法可以让我使用Fractal将标志发送到转换器?也许还有更好的方法吗?

更新

答案是有效的,但我是这样做的。。。。随心所欲:

变压器:

protected $indexRequest;
public function __construct($indexRequest = null)
{
    $this->indexRequest = $indexRequest ?? false;
}

分形调用:

return $this->fractal->paginatedCollection($vips, new VipTransformer(true));

我从未使用过分形,但你不能做一些事情,比如在VipTransformer类上添加一个标志吗。

 <?php
class VipTransformer
{
    protected $basicResponseFlag = false;

    public function setFlag($flag)
    {
        $this->basicResponseFlag = $flag;
    }
    public function transform(Vip $vip)
    {
        if($this->basicResponseFlag){
            //do basic stuff
        }
    }
}

现在开始你的VipsController@index:

/**
 * Display a listing of the resource.
 *
 * @return 'Illuminate'Http'Response
 */
public function index(Request $request, $perPage = 15)
{
    $page = $request->input('page');
    $vip = Cache::tags(['vips'])->remember("vip.index.$perPage.$page", 60, function() use ($perPage){
        Log::info('getting data from the database');
        return $this->vip->paginate($perPage, ['*'], ['gender','status','local','jobClass','nonMember','initiationDate','pensioner']);
    });
    $vipTransformer = new VipTransformer();
    $vipTransformer->setFlag(true); //set your transfomer to basic mode
    return $this->fractal->paginatedCollection($vip, $vipTransformer);
}