为什么在资源集合中使用附加参数会引发错误?

Why using additive paramerer in Resource collection raised error?

在 laravel 9 应用程序中,我想将附加参数添加到资源中并查看这个

我在 app/Http/Resources/CurrencyResource.php 重做的分支:

<?php

namespace App\Http\Resources;

use App\Library\Services\DateFunctionalityServiceInterface;
use Illuminate\Http\Resources\Json\JsonResource;
use App;
use Illuminate\Support\Facades\File;
use Spatie\Image\Image;
use App\Http\Resources\MediaImageResource;

class CurrencyResource extends JsonResource
{
    protected $show_default_image = false;

    public function showDefaultImage($value){
        $this->show_default_image = $value;
        return $this;
    }


    /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function toArray($request)
    {
        $dateFunctionality = App::make(DateFunctionalityServiceInterface::class);
        $currencyImage = [];
        $currencyMedia = $this->getFirstMedia(config('app.media_app_name'));

        if ( ! empty($currencyMedia) and File::exists($currencyMedia->getPath())) {
            $currencyImage['url']        = $currencyMedia->getUrl();
            $imageInstance              = Image::load($currencyMedia->getUrl());
            $currencyImage['width']      = $imageInstance->getWidth();
            $currencyImage['height']     = $imageInstance->getHeight();
            $currencyImage['size']       = $currencyMedia->size;
            $currencyImage['file_title'] = $currencyMedia->file_name;
        }
        else {
            \Log::info(  varDump($this->show_default_image, ' -1 $this->show_default_image::') );
            $currencyImage['url']  = $this->show_default_image ? '/images/default-currency.jpg' : '';
        }
        //         $currencyMedia = $currency->getFirstMedia(config('app.media_app_name'));
        return [
            'id'        => $this->id,
            'name'      => $this->name,
        ...

    

并控制代码:

'currency' => (new CurrencyResource($currency))->showDefaultImage(false),

它工作正常,但我遇到了一个错误:

Method Illuminate\Support\Collection::showDefaultImage does not exist.

当我使用此方法进行收集时:

return (CurrencyResource::collection($currencies))->showDefaultImage(true);

但是在上面的link中也有类似的方法:

UserResource::collection($users)->foo('bar');

我的代码有什么问题,如何解决?

谢谢!

我想知道您是否有理由不能使用这种方法:

然后您可以简单地使用请求参数来修改您的响应。

如果您真的想让该示例以这种方式工作,那么您似乎没有正确遵循该示例。

您需要覆盖 CurrencyResource 中的静态收集方法 class:

public static function collection($resource){
   return new CurrencyResourceCollection($resource);
}

您还需要创建 CurrencyResourceCollection class 并定义 showDefaultImage 方法和 $show_default_image 属性 在 class 上,如您提到的示例中所示。

那么你应该可以做到:

CurrencyResource::collection($currencies)->showDefaultImage(true);

你这样做的方式不起作用的原因是你没有在你的资源上定义静态收集方法因此它默认为返回默认收集对象的正常行为,正如你在你的错误信息。