Laravel фрактальные трансформеры

Я использую фрактальный пакет в Laravel 5.3. У меня есть модель игрока, который имеет hasMany отношения с видео, поэтому у одного игрока есть много видео.

Модельигрока:

public function videos()
  {
      return $this->hasMany(Video::class);
  }

Видео модель:

public function player()
{
    return $this->belongsTo(Player::class);
}

Я пытаюсь отправить данные игрока и добавить в него данные видео. Это код в контроллере:

            $player  =  fractal()
                       ->item($player)
                       ->parseIncludes(['videos'])
                       ->transformWith(new PlayerTransformer)
                       ->toArray();

И это PlayerTransformer:

<?php

namespace App\Transformer;

use App\Player;

class PlayerTransformer extends \League\Fractal\TransformerAbstract
{
    protected $availableIncludes = [
        'videos'
    ];

    public function transform(Player $player)
    {
        return [
          'id' => $player->id,
          'first_name' => $player->first_name,
          'last_name' => $player->last_name,
          'image' => $player->image_filename,
          'club' => $player->club,
          'birthday' => $player->birthday,
        ];
    }

    public function includeVideos(Player $player)
    {
        $videos = $player->videos()->where('processed', 1)->get();

        return $this->collection($videos, new VideoTransformer);
    }
}

Я получаю данные игрока, но я ничего не получаю за видео. Это не работает, но что еще более странно, если попробовать это с видео, в преобразователе которого у меня даже нет функции включения:

<?php

namespace App\Transformer;

use App\Video;

class VideoTransformer extends \League\Fractal\TransformerAbstract
{
    public function transform(Video $video)
    {
        return [
          'id' => $video->id,
          'uid' => $video->uid,
          'title' => $video->title,
          'image' => $video->getThumbnail(),
          'description' => $video->description,
          'views' => $video->viewCount(),
          'created_at' => $video->created_at->diffForHumans(),
        ];
    }
}

Но когда я пытаюсь включить туда данные игрока, это работает:

              $videos = fractal()
                        ->collection($videos)
                        ->parseIncludes(['player'])
                        ->transformWith(new VideoTransformer)
                        ->toArray();

Затем я попытался применить ту же настройку, что и для видео преобразователя, и удалить $availableIncludes а также includeVideos в проигрывателе transfomer, но он снова не работал там. Что я делаю неправильно?

1 ответ

Я делал получение без аутентификации, чтобы проверить свой контроллер, и он выдавал ошибку:

Неустранимая ошибка PHP: тип App\Transformers\CustomerCategoryTransformer::$availableIncludes должен быть массивом (как в классе League\Fractal\TransformerAbstract) в /app/Transformers/CustomerCategoryTransformer.php в строке 8

Я закомментировал строку:

      protected $defaultIncludes = [];
protected $availableIncludes = [];

Мой код:

      <?php

namespace App\Transformers;

use App\Models\CustomerCategory;
use League\Fractal\TransformerAbstract;

class CustomerCategoryTransformer extends TransformerAbstract
{
    // protected $defaultIncludes = [];

    // protected $availableIncludes = [];

    public function transform(CustomerCategory $model)
    {
        return [
            'id' => $model->id,
            'uuid' => $model->uuid,
            'seq' => $model->seq,
            'slug' => $model->slug,
            'name' => $model->name,
            'active' => $model->active,
            'created_at' => $model->created_at->toDateTimeString(),
            'updated_at' => $model->updated_at->toDateTimeString(),
        ];
    }
}

Другие вопросы по тегам