Dati
Models
I modelli sono le principali entità del framework che si occupano di leggere e scrivere i dati sul database.
I modelli saranno collocati nel namespace \App\{module}\Models
Ogni modello avrà una propria directory dedicata.
All'interno della classe del model non ci sarà alcuna logica scritta direttamente ma ogni model dovrà avere (quando necessario) un trait per implementare le logiche delle seguenti categorie:
- Relations: definiscono le relazioni tra i modelli (hasMany, belongsTo, etc.)
- Scopes: contengono query builder personalizzati per filtrare i dati
- Accessors: gestiscono la formattazione dei dati quando vengono recuperati dal DB
- Metodi di collezione: contengono metodi per operare su collezioni di modelli (es. ottenere tutti i record per una index)
- Altri Metodi: contengono metodi che operano su singole istanze del modello (da usare solo quando gli accessors non sono sufficienti)
La suddivisione del modello in più traits è una questione puramente organizzativa che porta diversi vantaggi:
- Migliore leggibilità del codice
- Più facile manutenzione
- Separazione chiara delle responsabilità
- Possibilità di riutilizzo dei traits tra modelli diversi
App
└── Shared
└── Models
└── User
├── 🐘 User.php
├── 🐘 UserAttributesTrait.php
├── 🐘 UserRelationshipsTrait.php
└── 🐘 UserScopesTrait.php
Comando per la creazione di un nuovo model
php artisan bb-make:model {module} {model}
Per esempio
php artisan bb-make:model shared company
creerà
App/Shared/Models/SharedCompany/SharedCompany.php (e i suoi traits)
DTOs
I Data Transfer Objects (DTO) sono oggetti che incapsulano e trasportano dati tra i diversi layer dell'applicazione.
Saranno collocati nel namespace \App\{module}\Dtos
I DTO svolgono un ruolo fondamentale nell'architettura:
- Forniscono una struttura tipizzata per il trasferimento dei dati
- Facilitano la comunicazione tra moduli e servizi
- Aiutano a mantenere un'interfaccia pulita tra i diversi layer
- Permettono di isolare le responsabilità e ridurre l'accoppiamento
Per implementare i DTO viene utilizzato il package spatie/laravel-data, che offre funzionalità avanzate come validazione, casting automatico e serializzazione.
Comando per la creazione di un nuovo DTO
php artisan bb-make:dto {module} {dto}
Per esempio
php artisan bb-make:dto shared company
creerà
App/Shared/Dtos/SharedCompanyDto.php
Mappers
I Mappers sono classi specializzate che convertono e trasformano dati da diversi formati in DTO.
Saranno collocati nel namespace \App\{module}\Mappers
I mapper svolgono un ruolo fondamentale quando:
- È necessario convertire dati da un formato all'altro (es. da array a DTO)
- Occorre aggregare più DTO in un unico DTO composito
- È richiesto un mapping tra strutture dati diverse
Ogni mapper implementa solitamente un metodo execute() che accetta i dati di input e restituisce il DTO trasformato.
Esempio: Mapping da Array a DTO
Un caso d'uso potrebbe conversione di dati di configurazione da array a un DTO tipizzato:
<?php
namespace App\Shared\Mappers\Modules;
use App\Shared\Dtos\Modules\ModuleConfigDto;
class ModuleConfigArrayToModuleConfigDto
{
public function execute(array $configData): ModuleConfigDto
{
return ModuleConfigDto::from([
'key' => $configData['key'] ?? null,
'name' => $configData['name'] ?? null,
'shortName' => $configData['short_name'] ?? null,
'shortNameSnake' => $configData['short_name_snake'] ?? null,
'shortNameKebab' => $configData['short_name_kebab'] ?? null,
'description' => $configData['description'] ?? null,
'namespace' => $configData['namespace'] ?? null,
'appPath' => $configData['app_path'] ?? null,
'databasePath' => $configData['database_path'] ?? null,
'storagePath' => $configData['storage_path'] ?? null,
'logsPath' => $configData['logs_path'] ?? null,
'devs' => $configData['devs'] ?? null,
]);
}
}