Обзор
Расширение функциональности Frame через подключаемые модули
Модули — это подключаемые пакеты, которые расширяют функциональность Frame, добавляя новые страницы, API-эндпоинты и UI-компоненты без изменения ядра.
Поставляемые модули
- Журнал событий (
frame/action-events) — аудит-лог действий пользователей, сравнение «Было/Стало», экспорт - Роли и права (
frame/permissions) — управление ролями, abilities, назначение на записи, интеграция с bouncer - Заметки (
frame/notes) — произвольные текстовые заметки на любой записи, Tiptap-редактор
Чем модуль отличается от ресурса?
Ресурс — описывает модель данных и генерирует стандартный CRUD-интерфейс (таблица, формы, фильтры).
Модуль — добавляет произвольную функциональность:
- Собственные страницы с кастомным UI
- API-эндпоинты
- Инъекции UI-компонентов в существующие страницы (App Slots)
- Контроль доступа через Gate
- Может использовать ресурсы внутри себя
Структура модуля
Модуль — это composer-пакет со следующей структурой:
packages/my-module/
├── composer.json
├── config/
│ └── my-module.php
├── src/
│ ├── MyModuleServiceProvider.php
│ ├── Http/Controllers/
│ ├── Resources/
│ └── routes/
│ └── api.php
└── resources/
└── js/
└── my-module/
├── index.ts
└── ...vue components
Порядок отображения
Модули отображаются в навигации в порядке, определяемом свойством order. Меньшее значение — выше в списке. По умолчанию order = 0.
$moduleManager->register(Module::make([
'title' => 'Analytics',
'link' => '/analytics',
'order' => 10,
]));
$moduleManager->register(Module::make([
'title' => 'Permissions',
'link' => '/permissions',
'order' => 20,
]));
В этом примере Analytics будет выше Permissions в навигации, независимо от порядка вызова register().
Подключение модуля
1. Установка через Composer
composer require vendor/my-module
Для локальной разработки добавьте path-репозиторий в composer.json:
{
"repositories": [
{
"type": "path",
"url": "./packages/my-module",
"options": { "symlink": true }
}
]
}
2. Подключение UI-части
В файле инициализации фронтенда (например resources/js/frame.js):
import { registerMyModule } from './modules/my-module'
// Регистрация модулей ДО инициализации FramePlugin
registerMyModule()
app.use(FramePlugin, { ... })
3. Публикация конфигурации
php artisan vendor:publish --tag=my-module-config