Концепция
Админ-панель Frame строится на ресурсах — PHP-классах, которые описывают модель данных и её отображение в интерфейсе. Один ресурс = один раздел панели с таблицей, формами создания/редактирования, поиском, фильтрами и действиями.
Что делает ресурс
- Связывает Eloquent-модель (
$model) с таблицей в БД - Определяет поля (
fields()) для таблицы и форм - Управляет валидацией, связями, правами доступа
- Настраивает сортировку, фильтрацию, экспорт, действия
- Автоматически добавляется в навигацию и глобальный поиск
Создание ресурса
php artisan frame:resource OrderResource
Команда создаёт класс в app/Frame/Resources/OrderResource.php на основе стаба. Имя аргумента — класс, оканчивающийся на Resource.
Пример готового ресурса:
<?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, 'Автор'),
];
}
}
Основные свойства и методы
id.tabler-news). Отображается в навигации, breadcrumbs, глобальном поиске.Визуальное представление записи
Помимо заголовка ($title) и подзаголовка ($subtitle), ресурс может отдавать картинку-превью через метод image($model). Её используют:
- Шапка detail-страницы
- Результаты глобального поиска
- Вкладка «Последние» в навигации
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() вашего сервис-провайдера.
Что дальше
- Создание схемы — пошаговое создание ресурса
- Таблицы · Формы · Экспорт
- Призмы · Агрегации · Сортировка
- Дашборды