@SuroviyD

Как пробросить свойство в дочернею в коллекцию ресурсов API?

Доброго времени суток, подскажите пожалуйста:
Есть первый json resource:
<?php

namespace App\Http\Resources\Infobject;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class InfobjectWithWayLineResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'label' => $this->name . ' (' . $this->code . ')',
            'color' => $this->color,
            'children' => InfobjectResource::collection($this->whenLoaded('infobjects'))
        ];
    }
}

И второй:
<?php

namespace App\Http\Resources\Infobject;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class InfobjectResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'label' => $this->type . ' ' . $this->name,
            'color' => '???'
        ];
    }
}

Как пробросить свойство color из InfobjectWithWayLineResource в InfobjectResource ?
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
@Samuel_Leonardo
создавайте кастомный class InfobjectResourceCollection extends ResourceCollection
и прокидывайте свойства на каждый элемент, будет что-то вроде этого
class InfobjectResourceCollection extends ResourceCollection{

   public $collects = InfobjectResource::class;
   public function toArray($request)
    {
        return $this->collection->map
                  ->additional($this->additional)
                  //можно прокинуть additional от коллекции, либо задать свойство в конструкторе коллекции
                  ->map
                  ->toArray($request)->all();
    }

}


встроенных методов для этого нет
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@SuroviyD Автор вопроса
Спасибо я так и поступил, вот что получилось:
<?php

namespace App\Http\Resources\Infobject;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

/**
 * @property mixed id
 * @property mixed type
 * @property mixed name
 */
class InfobjectResource extends JsonResource
{
    protected $wayLineColor = '';

    public function setWayLineColor($wayLineColor) {
        $this->wayLineColor = $wayLineColor;
        return $this;
    }

    /**
     * Transform the resource into an array.
     * Массив объектов инфраструктуры для массива линейных объектов
     * @param $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'label' => $this->type . ' ' . $this->name,
            'color' => $this->wayLineColor,
        ];
    }

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


<?php

namespace App\Http\Resources\Infobject;

use Illuminate\Http\Resources\Json\ResourceCollection;

class InfobjectResourceCollection extends ResourceCollection
{
    protected $wayLineColor = '';

    public function setWayLineColor($wayLineColor) {
        $this->wayLineColor = $wayLineColor;
        return $this;
    }
    /**
     * Transform the resource collection into an array.
     *
     * @param $request
     * @return array
     */
    public function toArray($request)
    {
        $this->collection->each->setWayLineColor($this->wayLineColor);
        return parent::toArray($request);
    }
}

Сам проброс:
<?php

namespace App\Http\Resources\Infobject;

use Illuminate\Http\Resources\Json\JsonResource;

/**
 * @property mixed id
 * @property mixed name
 * @property mixed code
 * @property mixed color
 */
class InfobjectWithWayLineResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     * Внешний массив линейные объекты
     * @param $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'label' => $this->name . ' (' . $this->code . ')',
            'color' => $this->color,
            'children' => InfobjectResource::collection($this->whenLoaded('infobjects'))
                ->setWayLineColor($this->color)
        ];
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы