Поддержка
Ресурсы

Призмы

Глобальные фильтры и преобразования для ресурсов

Призма — мощный механизм для определения глобальных фильтров и преобразований, которые применяются ко всем операциям ресурса на стороне сервера.

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

Проще говоря, призма — это прослойка между запросом к API и конечной операцией с моделью Eloquent. Например, можно ограничить список записей по роли пользователя или скрыть определённые поля.

Создание

php artisan frame:lens UserLens

Чтобы подключить призму, укажите её в методе lenses() ресурса:

public function lenses(FrameRequest $request): array
{
    return [
        YouLens::class,
    ];
}

Чтобы сохранить предустановленные фильтры и добавить свой:

public function lenses(FrameRequest $request): array
{
    return [
        ...parent::lenses($request),
        YouLens::class,
    ];
}

Доступные методы

title
→ string
Переопределяет название призмы в интерфейсе.
query
→ Builder|Relation
Переопределяет или модифицирует начальный Eloquent-запрос, используемый как основа для всех операций ресурса. Точка входа для сложных условий, соединений (joins), eager loading и кастомной логики.
fields
FrameRequest $request → array
Определяет поля, отображаемые при использовании призмы. Если не переопределён — используются поля ресурса.
actions
FrameRequest $request → Actions
Определяет действия, доступные для записей через призму (экспорт, публикация и др.). Возвращает объект Frame\Laravel\Options\Actions. Список действий берётся из ресурса.

title()

public static function title(): string
{
    return 'Озера';
}

query()

public function query(): Builder|Relation
{
    return parent::query()->where('type', 'lake');
}

fields()

public function fields(FrameRequest $request): array
{
    return [
        ID::make('ID'),

        Text::make('title', 'Title')
            ->required(),

        Radio::make('type', 'Type')
            ->options(['park', 'lake']),
    ];
}