Создание схемы
Ресурс — это PHP-класс, описывающий один раздел админ-панели для конкретной Eloquent-модели. Ниже — минимальный путь от миграции до рабочей страницы в панели.
Подготовьте модель и миграцию
Если модели ещё нет — создайте её:
php artisan make:model Post -m
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body')->nullable();
$table->boolean('is_published')->default(false);
$table->timestamps();
});
php artisan migrate
Сгенерируйте ресурс
php artisan frame:resource PostResource
Команда создаст app/Frame/Resources/PostResource.php на основе стаба. По умолчанию namespace — App\Frame\Resources, и ресурс автоматически попадает в навигацию Frame.
Привяжите модель
Укажите Eloquent-модель и поле-заголовок:
namespace App\Frame\Resources;
use App\Models\Post;
use Frame\Laravel\Resources\Resource;
class PostResource extends Resource
{
public static string $model = Post::class;
public static string $title = 'title';
}
$title определяет, какое поле использовать как заголовок в breadcrumbs и глобальном поиске.
Опишите поля
Метод fields() задаёт набор полей для таблицы и форм:
use Frame\Laravel\Fields\ID;
use Frame\Laravel\Fields\Text;
use Frame\Laravel\Fields\Textarea;
use Frame\Laravel\Fields\Toggle;
public function fields(): array
{
return [
ID::make('ID'),
Text::make('title', 'Заголовок')
->sortable()
->required(),
Textarea::make('body', 'Текст'),
Toggle::make('is_published', 'Опубликовано')
->editable(),
];
}
Типы полей — в разделе Поля. Для таблицы и форм можно задать разные наборы через fieldsForIndex() / fieldsForCreate() / fieldsForUpdate() — см. Таблицы и Формы.
Откройте панель
Перейдите в панель — в меню появится пункт Posts с таблицей, поиском и формой создания. Никакой дополнительной регистрации не нужно.
php artisan optimize:clear) и убедитесь, что класс лежит в app/Frame/Resources/ и наследует Frame\Laravel\Resources\Resource.Настройте опции (по желанию)
Через setUp() можно управлять поиском, сортировкой, экспортом, архивом и т.д.:
use Frame\Laravel\Options\Options;
protected function setUp(Options $options): void
{
$options->search->placeholder('Искать по заголовку');
$options->pagination->perPage(25);
$options->export->filename('posts.xlsx');
}
Подробнее: Экспорт, Сортировка, Агрегации.
Примеры частых доработок
Связь BelongsTo
use Frame\Laravel\Fields\BelongsTo;
use App\Frame\Resources\UserResource;
BelongsTo::make('author', UserResource::class, 'Автор'),
Валидация
Text::make('email', 'Email')
->required()
->rules('email', 'unique:users,email'),
Скрытый в навигации ресурс
class PostResource extends Resource
{
public static bool $showInGlobalNavigation = false;
public static bool $globalSearchAllowed = false;
}
Регистрация вручную (для ресурсов из модулей)
Если ресурс лежит не в app/Frame/Resources/, зарегистрируйте его в boot() своего ServiceProvider:
use Frame\Core\Frame;
public function boot(): void
{
Frame::register(\Modules\Blog\Frame\Resources\PostResource::class);
}