Версія v1.6.5 Попередні версії: документація на GitHub
Встановлення
На цій сторінці
Вимоги
| Компонент | Версія |
|---|---|
| PHP | 8.3+ (CI перевіряє 8.3, 8.4, 8.5) |
| Laravel | 12 або 13 |
| Inertia (серверна частина) | inertiajs/inertia-laravel ^3.0 (ставиться разом із пакетом) |
laravel/framework |
^12.0 або ^13.0 (обов'язкова залежність пакета) |
Фронтенд панелі поставляється зібраним (dist/), тож Node.js у вашому застосунку не потрібен.
Панель використовує власний клієнтський бандл і вимикає SSR Inertia для своїх маршрутів.
Встановлення
composer require maxcxam/larsadmin
php artisan larsadmin:install
larsadmin:install виконує по черзі:
- публікує конфіг (
larsadmin-config) уconfig/larsadmin.php; - публікує асети (
larsadmin-assets) уpublic/vendor/larsadminз перезаписом; - публікує сервіс-провайдер (
larsadmin-provider) вapp/Providers/LarsadminServiceProvider.phpі додає його вbootstrap/providers.php; - публікує міграції пакета (
larsadmin-migrations) уdatabase/migrations: журналу аудиту й запусків фонових дій; - копіює
lang/uk/validation.php, лише якщо такого файлу ще немає (існуючий не змінюється).
Міграцію не виконано: журнал аудиту вимкнено за замовчуванням. Щоб увімкнути його, виконайте
php artisan migrate, визначте gate viewLarsadminAudit і задайте LARSADMIN_AUDIT=true
(див. Журнал аудиту).
Сповіщення й фонові дії теж вимкнено. Щоб увімкнути їх, створіть таблицю notifications
(php artisan make:notifications-table), виконайте php artisan migrate, задайте
LARSADMIN_NOTIFICATIONS=true, запустіть обробник черги й заплануйте larsadmin:prune-notifications
(див. Сповіщення та фонові дії).
Після цього панель доступна за адресою /admin (див. ключ path нижче).
AI-асистенти (необов'язково)
Пакет постачає guideline, 15 скілів і локальний MCP-сервер для AI-асистентів (Claude Code, Cursor тощо).
З Laravel Boost 2.x вони встановлюються через php artisan boost:install, без нього командою
php artisan larsadmin:ai. MCP-серверу потрібен composer require laravel/mcp --dev; він працює лише
локально й ніколи в production. Див. AI-асистенти.
Оновлення пакета
composer update maxcxam/larsadmin
php artisan larsadmin:publish
larsadmin:publish публікує конфіг (існуючий перезаписується лише з --force) і завжди
перезаписує асети. Асети це не лише app.js і app.css: з 1.5 app.js лише невеликий вхідний
модуль, а код панелі, Vue й Inertia лежать у chunks/ (shared-*, vue-*, inertia-*, а також дзвіночок і
клієнт realtime, що вантажаться на вимогу), модулі для розширень у runtime/. Публікуйте весь каталог, а
не окремі файли.
Виправлення безпеки виходять патч-версіями останнього релізу 1.x, тож оновлюйтеся регулярно. Про вразливості повідомляйте приватно, не в публічних issue: див. SECURITY.md.
Теги публікації
| Тег | Куди копіюється |
|---|---|
larsadmin-config |
config/larsadmin.php |
larsadmin-assets (також laravel-assets) |
public/vendor/larsadmin |
larsadmin-lang |
lang/vendor/larsadmin |
larsadmin-provider |
app/Providers/LarsadminServiceProvider.php |
larsadmin-migrations |
database/migrations (міграції таблиць журналу аудиту й запусків фонових дій) |
php artisan vendor:publish --tag=larsadmin-lang
Тег larsadmin-lang не входить у larsadmin:install. Публікуйте його, коли хочете змінити переклади
(див. Локалізація).
Artisan-команди
| Команда | Призначення |
|---|---|
larsadmin:install |
перше встановлення |
larsadmin:publish [--force] |
оновити конфіг і асети |
larsadmin:entity {name} [--model=] [--force] |
створити Entity в app/Larsadmin |
larsadmin:action {name} [--destructive] [--force] |
створити Action в app/Larsadmin/Actions |
larsadmin:filter {name} [--force] |
створити Filter в app/Larsadmin/Filters |
larsadmin:dashboard {name} [--force] |
створити Dashboard в app/Larsadmin/Dashboards (Дашборди) |
larsadmin:value {name} [--force] |
створити метрику Value в app/Larsadmin/Metrics (Метрики) |
larsadmin:trend {name} [--force] |
створити метрику Trend в app/Larsadmin/Metrics |
larsadmin:partition {name} [--force] |
створити метрику Partition в app/Larsadmin/Metrics |
larsadmin:progress {name} [--force] |
створити метрику Progress в app/Larsadmin/Metrics |
larsadmin:extension {name} [--path=packages] [--field=] [--card=] [--force] |
створити пакет розширення в PATH/VENDOR/PACKAGE (Розширення) |
larsadmin:field {name} [--extension=] [--force] |
створити власне поле: PHP-клас і Vue-компоненти форми й відображення |
larsadmin:card {name} [--extension=] [--data] [--force] |
створити власну картку (Card чи з --data DataCard) і її Vue-компонент |
larsadmin:tool {name} [--extension=] [--force] |
створити сторінку меню (Tool) і її Vue-компонент |
larsadmin:ai [--skills] [--mcp] [--claude-md] [--path=.claude/skills] [--force] |
встановити скіли, запис MCP-сервера в .mcp.json і guideline в CLAUDE.md без Laravel Boost (AI-асистенти) |
larsadmin:mcp |
запустити MCP-сервер для AI-асистентів (stdio; потрібен laravel/mcp; лише не в production) (AI-асистенти) |
larsadmin:prune-audit [--days=] |
видалити записи журналу аудиту, старші за audit.retention_days (90 днів) (Журнал аудиту) |
larsadmin:prune-notifications [--days=] |
видалити сповіщення панелі, запуски фонових дій і їхні файли, старші за notifications.retention_days (30 днів) (Сповіщення) |
Конфігурація (config/larsadmin.php)
| Ключ | Змінна середовища | За замовчуванням | Опис |
|---|---|---|---|
name |
LARSADMIN_NAME |
APP_NAME + Admin (без APP_NAME: Laravel Admin) |
Назва в шапці та заголовку вкладки |
domain |
LARSADMIN_DOMAIN |
null |
Домен, на якому працює панель |
path |
LARSADMIN_PATH |
admin |
Префікс URI |
guard |
LARSADMIN_GUARD |
null (guard за замовчуванням) |
Guard автентифікації панелі |
locale |
LARSADMIN_LOCALE |
uk |
Мова панелі; null залишає мову застосунку |
locales |
['uk' => 'Українська', 'en' => 'English'] |
Мови, між якими перемикається користувач (код => підпис) |
|
timezone |
LARSADMIN_TIMEZONE |
null (app.timezone) |
Часовий пояс, у якому рахуються періоди метрик (Метрики) |
metrics.cache_store |
null (сховище за замовчуванням) |
Сховище кешу для метрик із cacheFor() |
|
metrics.throttle |
120 |
Ліміт запитів до ендпоінтів метрик на хвилину на користувача (гостя: на IP), лімітер larsadmin-metrics; null вимикає |
|
middleware |
['web', HandleInertiaRequests::class] |
Middleware всіх маршрутів панелі, включно зі сторінкою входу | |
auth_middleware |
[Authenticate::class, Authorize::class] |
Middleware маршрутів за екраном входу | |
allow_without_policy |
true |
Моделі без політики: true дозволяє, false забороняє |
|
allow_local |
LARSADMIN_ALLOW_LOCAL |
true |
У APP_ENV=local пускати в панель без gate viewLarsadmin |
actions.max_all |
1000 |
Максимум записів для дії з вибором «усі знайдені»; більше дає помилку валідації 422 | |
actions.queued_max_all, actions.queued_max_active |
10000, 3 |
Ліміти фонових дій: записів для «усіх знайдених» і активних запусків на користувача | |
actions.stale_after, actions.queued_stale_after |
3600, 86400 |
Через скільки секунд запуск без «серцебиття» (без $timeout, плюс 60 с) або в черзі вважається завислим (Сповіщення) |
|
actions.queue, actions.queue_connection |
LARSADMIN_QUEUE, LARSADMIN_QUEUE_CONNECTION |
null |
Черга й з'єднання черги для фонових дій за замовчуванням |
audit.enabled |
LARSADMIN_AUDIT |
false |
Вмикає журнал аудиту (Журнал аудиту) |
audit.connection |
LARSADMIN_AUDIT_CONNECTION |
null |
З'єднання БД журналу |
audit.* |
retention_days 90, max_value_length 1000, per_page 25, throttle 60 |
Таблиця, зберігання IP і User-Agent, очищення; див. Журнал аудиту | |
notifications.enabled |
LARSADMIN_NOTIFICATIONS |
false |
Вмикає дзвіночок і фонові дії (Сповіщення) |
notifications.realtime |
LARSADMIN_REALTIME |
auto |
Realtime через Reverb/Pusher: auto, true, false |
notifications.channel_prefix |
LARSADMIN_CHANNEL_PREFIX |
larsa_ |
Префікс broadcast-каналів панелі |
notifications.* |
poll_interval 60, per_page 15, retention_days 30, throttle 120 |
Опитування, сторінка дзвіночка, очищення; див. Сповіщення | |
extensions.source_maps |
LARSADMIN_EXTENSION_SOURCE_MAPS |
false |
Віддавати source maps (*.map) розширень; лише для налагодження (Розширення) |
extensions.max_age |
31536000 |
Строк кешу браузера для версійованих файлів розширень, секунд | |
mcp.enabled |
LARSADMIN_MCP |
null |
MCP-сервер: null лише при APP_ENV=local, true також в інших середовищах, крім production, false вимкнено; у production не працює ніколи (AI-асистенти) |
Увага. Коли
allow_localдорівнюєtrueіAPP_ENV=local, кожен автентифікований користувач потрапляє в панель. Не запускайте спільні чи публічні сервери зAPP_ENV=local, або задайтеLARSADMIN_ALLOW_LOCAL=false.
Приклад .env для продакшну:
LARSADMIN_NAME="Моя адмінка"
LARSADMIN_PATH=backoffice
LARSADMIN_ALLOW_LOCAL=false
Вхід
Панель має власну сторінку входу (/admin/login) з обмеженням частоти: 5 спроб на хвилину
для пари email + IP і 30 на хвилину для одного IP.
Content Security Policy
Якщо застосунок задає CSP, увімкніть nonce стандартним Vite::useCspNonce() у middleware, що виконується
до рендера сторінок панелі: inline-скрипт теми, import map розширень, тег app.js і теги modulepreload
отримують атрибут nonce. Без nonce сувора CSP блокує import map, і розширення не завантажуються (панель працює). Приклад:
Розширення: CSP і nonce.
Кеш маршрутів
Якщо застосунок використовує php artisan route:cache, після зміни path або domain
перебудуйте кеш. Пакет не реєструє маршрути, коли кеш маршрутів активний.
Далі: Сутності.
Розробка пакета
У корені репозиторію пакета:
| Команда | Призначення |
|---|---|
composer test |
Pest + Testbench |
composer format |
Pint |
npm test |
фронтенд-тести (vitest) |
npm run i18n |
генерує resources/js/i18n/uk.json з lang/uk/ui.php |
npm run build |
збірка dist/ |
Файл resources/js/i18n/uk.json потрібно комітити: після зміни lang/uk/ui.php запустіть
npm run i18n. Так само комітиться dist/. CI перевіряє, що dist/ актуальний
(git diff --exit-code dist після збірки).
tests/Ai перевіряє скіли (resources/boost/skills): кожна сторінка посібника, команда larsadmin:*, ключ
конфігу, змінна LARSADMIN_* і публічний клас мають бути згадані в якомусь скілі, а все, що скіли згадують,
має існувати. Тож нове чи змінене публічне API оновлює скіл у тому самому PR. Кожна сторінка посібника
має бути і в docs/guide/, і в docs/guide/en/.