Base
Sto creando un applicativo molto complesso utilizzando:
- Laravel (https://laravel.com/docs/12.x)
- Jetstream (https://jetstream.laravel.com/introduction.html#livewire-blade) con Livewire (https://livewire.laravel.com/docs/quickstart), e quindi include TailwindCss e AlpineJs
- Spatie Role Permission (https://spatie.be/docs/laravel-permission/v6/introduction)
- Rappasoft Laravel Livewire Tables (https://rappasoft.com/docs/laravel-livewire-tables/v3/introduction)
- Altri pacchetti
Config automatico
Vorrei creare un sistema (credo che creare un provider sia il modo migliore, ma puoi suggerire altre soluzioni) che:
- utilizza il sistema di Laravel e Jetsream di autenticazione
- si basa sempre sul model User di Laravel e i Roles e Permissions che ho tramite il pacchetto di Spatie posso avere un processo automatizzato che segui questa logica:
- In un file personalizzato inserito nella cartella
config(chiamatoastrisk.php) viene definito un array con struttura (simile a quella proposta ma puoi modificarla secondo i miglioramenti che puoi proporre):
<?php
return [
'auto' => [
'configs' => [
'default_layout' => 'layout\\guest'
],
'master' => [
'configs' => [
'middlewares' => [
'web'
],
],
'models' => [
'articles' => [
'model' => 'App\\Models\\Article',
'configs' => [
...
],
'operations' => [
'C' => [
'enabled' => true,
'middlewares' => [
'role:creator'
]
],
'R' => true,
'U' => false,
'D' => [
'middlewares' => [
'role:admin',
'owner'
]
],
]
]
],
],
'admin' => [
'configs' => [
'default_layout' => 'layout\\admin',
'prefix' => 'admin',
'middlewares' => [
'auth',
'role:admin'
]
],
'models' => [
'videos' => [
'model' => 'App\\Models\\Admin\\Video\\',
'operations' => [
'C' => [
'enabled' => true,
'middlewares' => [
'role:creator'
]
],
'R' => true,
'U' => true,
'D' => true,
],
...
],
'images' => [
'model' => 'App\\Models\\Admin\\Image\\',
'operations' => [
'C' => true,
'R' => [
'enabled' => [
'list' => true,
'single' => false
]
],
'U' => true,
'D' => false,
],
...
],
...
]
],
...
],
...
];alcune parole saranno riservate (come ‘auto’, ‘master’, ‘middlewares’, ‘configs’, ‘operations’, ecc) per definire aree e funzionalità, altre (come ‘C’, ‘R’, ‘U’, ‘D’) saranno un enum esterno che definisce le varie opzioni (nel caso di ‘operations’ ad esempio si potrebbe partire con le semplici opzioni CRUD ma in futuro si potrebbe implementare un nuovo valore ‘GQL’ che crea un restpoint GraphQL). Alcune opzioni possono essere sovrascritte secondo il livello di annidamento (ad esempio il ‘config’ dentro ‘auto’ specifica un ‘default_layout’, ma questa opzione è sovrascritta dentro il ‘config’ di ‘admin’) 2) Il provider legge questo file ed esegue una serie di operazioni in base alle parole riservate;
la prima funzionalità da implementare è quello per la parola chiave ‘auto’:
- qui vengono rappresentati vari modelli che contengono la path a un model laravel (che verrà creato esternamente da questo processo, quindi sarà già presente).
- Il provider registra i route, applica i middlewares e le altre configurazioni.
- Questi routes e modelli utilizzeranno dei componenti dinamici che si adatteranno in base al modello (che dobbiamo creare)
I model laravel estendono una classe (che dobbiamo creare) che permette di integrarsi a questo sistema e definisce anche altre funzionalità se necessario
I componenti dinamici per le operazioni intanto devono essere:
- C: CreateAutoModelForm: componente livewire che legge dal model i campi che può creare (da un array personalizzato con opzioni tipo ‘required’, ‘size’, ‘type’, ecc) e crea un form che utilizza le validazioni ecc
- R: due file:
- AutoModelTable: componente che utilizza Rappasoft Laravel Livewire Tables per creare una tabella con funzionalità di ricerca, filtri ecc per il model (sempre basandosi sull’array personalizzato)
- AutoModelDetail: componente di visualizzazione dettaglio. Di default vengono listate i valori del modello, ma bisogna anche prevedere che questa vista possa essere sovrascritta
- U: AutoModelForm: simile a C ma per aggiornare il modello
- D: DeleteAutoModelForm: componente che esegue i controlli necessari (come controllare i constrain del db) ed elimina il modello
- L: ListAutoModels: componente che lista (con paginazione) il model. Questo componente viene utilizzato nelle pagine pubbliche. Ogni model lo può sovrascrivere
- V: ViewAutoModel: componente per vista dettaglio pubblica del model. Ogni model lo può sovrascrivere
Bisogna quindi creare:
- il provider,
- il model generico (che estende il model base laravel) che i modelli estenderanno
- i componenti dinamici
- altri file se necessario