Skip to main content

Best practices

Convenzioni

Laravel segue una serie di convenzioni di naming ben definite che aiutano a mantenere il codice organizzato e prevedibile. Seguire queste convenzioni è importante per:

  • Mantenere consistenza nel codebase
  • Facilitare la comprensione del codice da parte di altri sviluppatori
  • Sfruttare le funzionalità di auto-loading e service container
  • Seguire le best practices della community

Cheat Sheet Convenzioni Laravel

File e Classi

TipoConvenzioneEsempio
ModelSingolare, PascalCaseUser.php, ProjectStatus.php
ControllerSingolare, PascalCase, suffisso ControllerUserController.php
ServiceSingolare, PascalCase, suffisso ServicePaymentService.php
TraitSingolare, PascalCase, suffisso descrittivoNotifiable.php, HasApiTokens.php
InterfaceSingolare, PascalCase, può avere prefisso IRepositoryInterface.php
MigrationData_descrizione_snake_case2024_01_20_create_users_table.php
SeederSingolare, PascalCase, suffisso SeederUserSeeder.php
FactorySingolare, PascalCase, suffisso FactoryUserFactory.php
TestPascalCase, suffisso TestUserServiceTest.php

Database

TipoConvenzioneEsempio
TabellePlurale, snake_caseusers, project_statuses
Pivot TablesSingolare, snake_case, in ordine alfabeticouser_project
Colonnesnake_casefirst_name, created_at
Foreign Keyssingolare_table_iduser_id, project_id
Primary Keysidid

Metodi e Variabili

TipoConvenzioneEsempio
MetodicamelCasegetUser(), sendEmail()
VariabilicamelCase$firstName, $emailAddress
CostantiSCREAMING_SNAKE_CASEUSER_STATUS_ACTIVE
ProprietàcamelCasepublic $firstName

Enums

TipoConvenzioneEsempio
EnumPascalCase, singolare, suffisso EnumUserStatusEnum, PaymentTypeEnum
Enum KeysSCREAMING_SNAKE_CASEPENDING, IN_PROGRESS, COMPLETED
Enum Valuessnake_casepending, in_progress, completed
Enum MethodscamelCasetoString(), fromValue()
tip

Gli enum dovrebbero essere utilizzati per rappresentare un insieme fisso di valori possibili. Ogni valore dovrebbe avere un nome descrittivo e significativo.

Route e View

TipoConvenzioneEsempio
Routekebab-caseusers/show-archived
Route Namesdot.notationadmin.users.index
Viewskebab-caseshow-user.blade.php
Configsnake_caseapp.timezone

Relazioni Eloquent

TipoConvenzioneEsempio
hasOne/belongsTosingolare, camelCasepublic function user()
hasMany/belongsToManyplurale, camelCasepublic function comments()
scopescope + descrizione, camelCasepublic function scopeActive()
tip

È importante notare che queste convenzioni non sono solo una questione di stile, ma spesso sono necessarie per il corretto funzionamento delle funzionalità di Laravel come l'auto-discovery dei modelli, il binding delle rotte e il service container.

Commenti

Ogni service dovrà essere ben commentato (gli LLM aiutano molto). Nel resto delle classi è opzionale e gradito ma non paticolarmente necessario dato che per Models, Controllers, Listeners ecc, la business logic non viene implementata direttamente.

Tools

Per garantire la consistenza del codice e prevenire errori, ogni sviluppatore deve avere installato e configurato i seguenti strumenti di formattazione:

Questi strumenti permettono di:

  • Mantenere uno stile di codice uniforme attraverso la formattazione automatica
  • Identificare problemi potenziali durante lo sviluppo
  • Prevenire commit con errori di formattazione o violazioni delle regole
  • Migliorare la leggibilità e manutenibilità del codice

Si raccomanda di configurare questi strumenti per la formattazione automatica al salvataggio del file.

Logs

Logging in Canali Specifici

Per garantire una gestione efficace dei log e facilitare il debugging, è fondamentale utilizzare canali di logging specifici organizzati per modulo e argomento. Questo approccio è particolarmente importante per i servizi che si interfacciano con server di terze parti.

Organizzazione dei Canali

Per ogni modulo, sono presenti 3 canali standard per la gestione dei log:

  • general: Per errori e informazioni generiche del modulo
  • validation: Per errori di validazione
  • db: Per errori relativi al database
info

All'interno di ogni modulo, utilizzare canali specifici per argomenti/servizi particolari come per esempio "pay/stripe" oppure "mc/bonus"

Esempio di Configurazione

// config/logging.php
'channels' => [
'pay/general' => [
'driver' => 'daily',
'path' => storage_path('logs/PayModule/general.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true,
],
'pay/validation' => [
'driver' => 'daily',
'path' => storage_path('logs/PayModule/validation.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true,
],
'pay/db' => [
'driver' => 'daily',
'path' => storage_path('logs/PayModule/db.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true,
],
'pay/stripe' => [
'driver' => 'daily',
'path' => storage_path('logs/PayModule/stripe.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => env('LOG_DAILY_DAYS', 14),
'replace_placeholders' => true,
],
]

Best Practices per Servizi di Terze Parti

  1. Log delle Richieste: Registrare sempre richieste in uscita con payload e headers
  2. Log delle Risposte: Tracciare risposte, codici di stato e tempi di risposta
  3. Log degli Errori: Dettagliare errori di rete, timeout e fallimenti

Environment files

È fondamentale mantenere sincronizzati i file di ambiente .env.example e .env.testing con il file .env principale. Ogni volta che viene aggiunta o modificata una variabile d'ambiente nel .env, è necessario aggiornare anche gli altri file di configurazione. Questo garantisce che i nuovi sviluppatori abbiano un template completo e aggiornato per configurare l'ambiente locale e che i test automatizzati utilizzino le variabili d'ambiente corrette. La mancata sincronizzazione di questi file può portare a errori difficili da diagnosticare e a configurazioni incomplete degli ambienti di sviluppo.

warning

Attualmente la sincronizzazione dei file .env deve essere effettuata manualmente. In futuro verrà implementato uno script di pre-commit per automatizzare questo processo e garantire la coerenza tra i file di configurazione.