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(),
];
}
}