Обращение к методу collection() API ресурса прямо из модели в Laravel

Если вы отдаете данные в вашем API с помощью API ресурсов (через метод collection()), соблюдая при этом правила наименований, то, скорее всего, вам приходится постоянно импортировать пространство имен класса-ресурса с присвоением ему псевдонима через оператор as, так как название ресурса и модели совпадают.

Мне кажется это не очень практично. Я предлагаю реализовать в моделях метод collection(), который будет находить необходимый ресурс и вызывать метод collection() уже у него.

Для этого, напишем новый трейт Collectable:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<?php   namespace App\Models\Concerns;   use Illuminate\Support\Collection;   trait Collectable { /** * Возвращает данные модели, пропущенные через класс-ресурс. * * @param Collection $collection * @return mixed */ public static function collection(Collection $collection) { $resourceClass = self::$resourceClass ?? class_basename(self::class);   return call_user_func( ["\\App\\Http\\Resources\\$resourceClass", 'collection'], $collection ); } }

Осталось лишь подключить данный трейт к вашим моделям, данные которых вы возвращаете в вашем API.

Теперь не нужно обращаться к классу ресурса 😲

Комментарии

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: