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

Создание схемы

Пошаговое создание ресурса Frame для существующей Eloquent-модели

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

Подготовьте модель и миграцию

Если модели ещё нет — создайте её:

php artisan make:model Post -m
database/migrations/..._create_posts_table.php
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-модель и поле-заголовок:

app/Frame/Resources/PostResource.php
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() задаёт набор полей для таблицы и форм:

app/Frame/Resources/PostResource.php
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() можно управлять поиском, сортировкой, экспортом, архивом и т.д.:

app/Frame/Resources/PostResource.php
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);
}