Skip to main content

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,
]);
}
}