componist / core
Laravel dashboard core: layouts, menus, settings, notifications, Blade/Livewire UI primitives, and shared security helpers
Requires
- php: ^8.2
- componist/reminder-notifications: *
- livewire/livewire: ^4.0
Requires (Dev)
- larastan/larastan: ^3.9
- phpstan/phpstan: ^2.1
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-21 18:03:32 UTC
README
componist/core ist das Basis-Package fuer das Componist-Dashboard in Laravel.
Es liefert:
- Dashboard-Routen unter
/dashboard - Livewire-Module fuer Menues, Menu-Items, Settings und Notifications
- Blade-Komponenten und Layouts
- Datenbanktabellen inkl. Seeder fuer einen schnellen Start
- Helper-Funktionen zur Einbindung in eigene Views
Inhalt
- 1) Voraussetzungen
- 2) Installation
- 3) Publish-Tags im Ueberblick
- 4) Datenbank: Migrationen und Seeder
- 5) Routing und Module
- 6) Berechtigungen und Sicherheit
- 7) Konfiguration
- 8) Blade- und Livewire-Komponenten
- 9) Helper-Funktionen mit Beispielen
- 10) Benachrichtigungen erstellen
- 11) Assets (Vite, JS, CSS)
- 12) Typische Integrations-Workflows
- 13) Troubleshooting
- 14) Lizenz
1) Voraussetzungen
- PHP
8.2+(im Monorepo aktuell mit Laravel 12 genutzt) - Laravel
12.x - Livewire
4.x - Node.js LTS (fuer Vite/Tailwind-Assets)
Installation
Monorepo (dieses Projekt)
Das Package ist bereits im Monorepo vorhanden. In der Regel reichen:
composer dump-autoload php artisan package:discover
Externes Projekt
Wenn du componist/core ausserhalb des Monorepos nutzt:
composer require componist/core
Hinweis: Je nach Setup brauchst du ggf. einen VCS- oder Path-Repository-Eintrag in der Host-composer.json.
3) Publish-Tags im Ueberblick
Der CoreServiceProvider stellt mehrere Tags bereit.
Vollinstallation (empfohlen fuer schnellen Start)
php artisan vendor:publish --tag=componist.core.install
Veroeffentlicht:
- CSS/JS nach
resources/cssundresources/js config/markdownx.phpconfig/componist.phpresources/views/dashboard.blade.phptailwind.config.js,vite.config.js,package.jsonin die Projekt-Root
Wichtig: Dieser Tag kann vorhandene Build-Dateien in der Root ueberschreiben.
Weitere Tags
# Blade-Views + View-Komponenten-Klassen php artisan vendor:publish --tag=core.publishes # Core Components (Views) php artisan vendor:publish --tag=core.components # Error-Pages (Canonical unter packages/componist/core/resources/views/errors) php artisan vendor:publish --tag=core.pages.errors # E-Mail-Branding (config/componist_mail.php) php artisan vendor:publish --tag=componist.core.mail # Dashboard-Layout als anpassbare App-Kopie php artisan vendor:publish --tag=core.page.dashboard
Error-Pages: Locale aus app()->getLocale(), Light/Dark, Primary Teal. Nach Änderungen im Package erneut publishen bzw. Root syncen.
4) Datenbank: Migrationen und Seeder
Migrationen
Das Package laedt Migrationen automatisch (loadMigrationsFrom).
php artisan migrate
Relevante Tabellen:
menusmenu_items(inkl.icon,page_id, Indizes/FKs je nach Migrationstand)settingscomponist_core_notifications
Seeder
php artisan db:seed --class="Componist\Core\Seeders\SettingsTableSeeder" php artisan db:seed --class="Componist\Core\Seeders\MenuTableSeeder" php artisan db:seed --class="Componist\Core\Seeders\MenuItemTableSeeder"
Der MenuItemTableSeeder legt u. a. Standardeintraege fuer folgende Route-Namen an:
dashboard.indexcomponist.core.menuscomponist.core.settings
Nutzung
Das Package registriert seine Routen unter:
- Prefix:
/dashboard - Name-Prefix:
componist.core. - Middleware:
config('componist.auth')(Standard:['auth'])
Home-Routen (Auth)
dashboard.index->/dashboard(Middleware:auth,twofactor,verify)profile->/profile(gleiche Middleware)- Views:
component::backend.dashboard,component::backend.profile
Verfuegbare Routen (je nach Modul-Flags)
componist.core.settings->/dashboard/settingscomponist.core.menus->/dashboard/menucomponist.core.menu.items->/dashboard/menu/items/{id}componist.core.notification->/dashboard/notificationcomponist.core.notification.show->/dashboard/notification/{componistCoreNotification}
Beispiel zum Deaktivieren eines Bereichs:
// config/componist.php 'routes' => [ 'settings' => true, 'menu' => true, ],
Berechtigungen
Standardmaessig wird eine Gate-Ability registriert:
- Ability:
componist.core.manage - Default-Logik: erlaubt, wenn
User->is_admintruthy ist
Mutierende Aktionen in Menue- und Menu-Item-Livewire-Komponenten verwenden:
Gate::authorize(config('componist.manage_ability', 'componist.core.manage'));
Eigene Berechtigungsstrategie
In config/componist.php:
'manage_ability' => 'admin.panel.manage',
Und in deiner App (z. B. in AppServiceProvider):
use Illuminate\Support\Facades\Gate; Gate::define('admin.panel.manage', function ($user): bool { return $user->hasRole('admin'); });
Konfiguration
config/componist.php
Wichtige Keys:
routes.*: schaltet Dashboard-Module ein/austemplate.*: Layout-Komponentendark_mode: Feature-Flag fuer UIauth: Middleware-Stack fuer Dashboard-Routenmanage_ability: Gate-Ability fuer Admin-Aktionenselect2.allowed_tables: Allowlist fuer dynamische Select2-Datenquellen
config/config.php (componistConfig)
Steuert die automatische Registrierung:
components: Blade-Komponenten-Mappinglivewire: Livewire-Komponenten-Mappingprefix: globaler Prefix fuer Aliasnamen
Prefix-Beispiel:
// config/config.php 'prefix' => 'core-',
Dann lautet z. B. der Alias:
- Blade:
<x-core-layouts-dashboard /> - Livewire:
@livewire('core-menu.index')
Dark / Light Mode
Einheitlich über Alpine:
- Im Layout-
<head>:@include('component::components.layouts.partials.theme-boot') - Toggle:
$store.theme.toggle()/ Zustand:$store.theme.dark - Persistenz:
localStorage.theme(dark|light), Klassedarkauf<html>
Keine parallelen Theme-Scripts oder sessionStorage. Details: Cursor-Rule .cursor/rules/theming.mdc.
config/componist_mail.php (E-Mail-Design)
Einheitliches Soft-Split-Layout (linke Teal-Akzentschiene, strukturierte Blöcke) für die ganze App:
| Key | Bedeutung |
|---|---|
brand_name |
Markenname (Default: APP_NAME) |
logo_path |
Logo unter public/ oder absolute URL |
primary |
CTA-/Akzentfarbe (Default #14b8a6) |
footer_text |
Optionaler Footer-Hinweis |
support_url |
Support-Link im Footer |
theme |
Laravel-Markdown-Theme (Default componist) |
MailMessage / Auth-Notifications nutzen automatisch Theme componist (Provider setzt mail.markdown.*).
HTML-Mailables wrappen Inhalt so:
<x:component::mail.shell title="Passwort zurücksetzen" label="Sicherheit" preheader="Link 60 Minuten gültig"> <x:component::mail.heading title="Passwort zurücksetzen" greeting="Hallo Anna," /> <x:component::mail.sep /> <x:component::mail.section> <p>wir haben eine Anfrage erhalten …</p> </x:component::mail.section> <x:component::mail.sep /> <x:component::mail.section padding="cta"> <x:component::mail.button url="{{ $url }}">Neues Passwort festlegen</x:component::mail.button> </x:component::mail.section> <x:component::mail.section> <x:component::mail.panel title="Sicherheitshinweis">…</x:component::mail.panel> </x:component::mail.section> </x:component::mail.shell>
Neue Feature-Mails sollen kein eigenes HTML-Layout erfinden.
8) Blade- und Livewire-Komponenten
Form- und Button-Primitives (einheitlich)
Alle Form-/Button-Klassen liegen zentral in Componist\Core\Support\Ui. Nutze die Blade-Komponenten statt eigener Tailwind-Strings:
<x:component::form.label value="E-Mail" /> <x:component::form.input type="email" wire:model="email" /> <x:component::form.input-error for="email" /> <x:component::form.textarea wire:model="notes" /> <x:component::form.select wire:model="status">…</x:component::form.select> <x:component::button.primary wire:click="save">Speichern</x:component::button.primary> <x:component::button.secondary wire:click="cancel">Abbrechen</x:component::button.secondary>
Tokens (Auszug): Ui::FIELD, Ui::TEXTAREA, Ui::LABEL, Ui::BUTTON_PRIMARY, Ui::BUTTON_SECONDARY, Ui::SURFACE. Light/Dark und Teal-Focus sind darin enthalten; Fehlerzustände über aria-invalid="true".
Blade
<x-layouts-dashboard> <x-element-modal id="example-modal"> <x-slot name="title">Beispiel</x-slot> Inhalt im Modal </x-element-modal> </x-layouts-dashboard>
Livewire
@livewire('menu.index') @livewire('menu-item.index', ['id' => $menuId]) @livewire('notification.componist-core-notification-bell') @livewire('notification.componist-core-notification')
9) Helper-Funktionen mit Beispielen
Das Package autoloaded src/Helpers/helpers.php.
setting(string $key)
Liest einen Setting-Wert aus der Tabelle settings.
$siteTitle = setting('site_title');
menu(string $menuName, ?string $type = null)
Liefert ein Menue als HTML oder als Array.
{{-- Standard-Template --}} {!! menu('admin') !!} {{-- Spezifisches Template --}} {!! menu('admin', 'vertical') !!}
// Als Datenstruktur statt HTML $items = menu('admin', 'array');
componist_menu_href($menuItem)
Resolved den Link fuer einen Menu-Item anhand von Typ und Route-Fallback.
$href = componist_menu_href($menuItem);
10) Benachrichtigungen erstellen
Du kannst programmatisch Eintraege fuer die Core-Notifications anlegen:
use Componist\Core\Models\ComponistCoreNotification; ComponistCoreNotification::CreateMessage( auth()->id(), // alternativ E-Mail als String 'Deployment erfolgreich', 'Das neue Release wurde erfolgreich ausgerollt.' );
Die Notification-Livewire-Seiten zeigen anschliessend:
- Liste (
/dashboard/notification) - Detailansicht inkl. Read-Markierung (
/dashboard/notification/{id})
11) Assets (Vite, JS, CSS)
Nach vendor:publish --tag=componist.core.install stehen die Assets in deinem Host-Projekt bereit.
Build
npm install npm run build
Development
npm run dev
Typische Files:
resources/css/dashboard.cssresources/js/dashboard.jsresources/js/tinymce.js- ggf.
resources/css/app.css,resources/js/app.js,resources/js/guest.js
Tailwind CSS: Componist-Views scannen
Damit Tailwind v4 Utility-Klassen aus Blade-Views aller installierten Componist-Packages erkennt, muss in den veröffentlichten CSS-Dateien folgende @source-Zeile enthalten sein:
@source '../../vendor/componist/**/resources/views/**/*.blade.php';
Diese Zeile ist in den Package-CSS-Dateien (app.css, dashboard.css, guest.css) bereits vorkonfiguriert und wird beim Publish mit übernommen.
12) Typische Integrations-Workflows
A) Schnellstart fuer internes Admin-Panel
- Package installieren/autoloaden
vendor:publish --tag=componist.core.installphp artisan migrate- Seeder laufen lassen
npm run build/dashboard/menuaufrufen und Menue pflegen
B) Sicherheit zuerst (empfohlen in produktiven Projekten)
manage_abilityauf eigene Ability setzen- Eigene
Gate::define(...)-Regel hinterlegen componist.authum zusaetzliche Middleware erweitern (z. B.verified,2fa)- Optional
routes.*auf benoetigte Module reduzieren
Hinweise
Menue-Links erscheinen nicht
- Pruefen, ob
nameoderview_pathauf existierende Route zeigt. - Bei
type=route/pagewird auf benannte Routen geprueft.
Dashboard-Routen geben 403
- User hat keine freigegebene Ability (
manage_ability). - Gate-Regel und
is_admin/Rollenmodell pruefen.
Styles/Skripte fehlen
- Nach Publish
npm install+npm run buildausfuehren. - Bei lokaler Entwicklung
npm run devstarten.
Ueberschriebene Build-Dateien
componist.core.installschreibtpackage.json,vite.config.js,tailwind.config.js.- Vorher bestehende Dateien sichern oder gezielt einzelne Publish-Tags verwenden.
Commands
Keine Artisan-Commands in diesem Package.
Tests
php artisan test --compact --testsuite="Componist Core"
14) Lizenz
MIT