Поддержка

Концепция

Что такое ресурсы в Frame и как они устроены

Админ-панель Frame строится на ресурсах — PHP-классах, которые описывают модель данных и её отображение в интерфейсе. Один ресурс = один раздел панели с таблицей, формами создания/редактирования, поиском, фильтрами и действиями.

Что делает ресурс

  • Связывает Eloquent-модель ($model) с таблицей в БД
  • Определяет поля (fields()) для таблицы и форм
  • Управляет валидацией, связями, правами доступа
  • Настраивает сортировку, фильтрацию, экспорт, действия
  • Автоматически добавляется в навигацию и глобальный поиск

Создание ресурса

php artisan frame:resource OrderResource

Команда создаёт класс в app/Frame/Resources/OrderResource.php на основе стаба. Имя аргумента — класс, оканчивающийся на Resource.

Пример готового ресурса:

app/Frame/Resources/OrderResource.php
<?php

declare(strict_types=1);

namespace App\Frame\Resources;

use App\Models\Order;
use Frame\Laravel\Fields\BelongsTo;
use Frame\Laravel\Fields\ID;
use Frame\Laravel\Fields\Text;
use Frame\Laravel\Resources\Resource;

class OrderResource extends Resource
{
    public static string $model = Order::class;

    public static string $title = 'title';

    public function fields(): array
    {
        return [
            ID::make('ID'),
            Text::make('title', 'Название'),
            BelongsTo::make('author', UserResource::class, 'Автор'),
        ];
    }
}

Основные свойства и методы

$model
class-string<Model>
Полное имя Eloquent-модели, к которой привязан ресурс.
$title
string
Имя поля, значение которого будет заголовком на странице просмотра записи. По умолчанию — id.
$subtitle
?string
Имя поля для подзаголовка записи. Опционально.
$group
?string
Группа в навигации. Ресурсы с одинаковой строкой группируются вместе.
$icon
?string
Иконка Tabler (например tabler-news). Отображается в навигации, breadcrumbs, глобальном поиске.
image()
TModel → ?string
Визуальное представление записи — URL изображения для шапки detail-страницы и глобального поиска. Вызывается автоматически, если метод определён.
fields()
→ array
Список полей для таблицы и форм. Подробнее — Поля.
fieldsForIndex()
→ array
Переопределяет поля только для таблицы.
fieldsForCreate() / fieldsForUpdate()
→ array
Переопределяют поля для форм.
fieldsForExport()
→ array
Переопределяет поля для экспорта.
lenses()
FrameRequest \$request → array
Глобальные фильтры/преобразования — призмы.
setUp(Options \$options)
void
Хук настройки опций ресурса: поиск, сортировка, экспорт, пагинация, archive и т.д.

Визуальное представление записи

Помимо заголовка ($title) и подзаголовка ($subtitle), ресурс может отдавать картинку-превью через метод image($model). Её используют:

  • Шапка detail-страницы
  • Результаты глобального поиска
  • Вкладка «Последние» в навигации
app/Frame/Resources/PostResource.php
use Frame\Core\Frame;

public function image(Post $post): ?string
{
    // Достаём URL обложки через активный MediaDriver
    $items = Frame::mediaDriver()->resolve($post, 'cover');

    return $items[0]['path'] ?? null;
}

Для простых случаев (когда превью — обычная колонка с URL) достаточно вернуть её напрямую:

public function image(Post $post): ?string
{
    return $post->preview_url;
}

Если метод не определён — в этих местах просто не будет картинки.

Чтобы миниатюра была ещё и в таблице — добавьте Image::make('cover', 'Обложка') в fieldsForIndex(). Эти два механизма независимы: image() даёт превью для карточек/поиска, а Image поле — колонку в таблице.

Автоматическая регистрация

Ресурсы подхватываются без явной регистрации, если:

  • Класс лежит в app/Frame/Resources/
  • Наследует Frame\Laravel\Resources\Resource

Для ресурсов из модулей/пакетов используйте Frame::register(MyResource::class) в boot() вашего сервис-провайдера.

Что дальше