Introduzione alla Struttura di Laravel
Benvenuti alla terza lezione del nostro corso "Impara Laravel in 50 lezioni". Dopo aver installato l'ambiente di sviluppo e creato il vostro primo progetto, potreste sentirvi sopraffatti guardando l'albero delle directory di Laravel. A differenza di un semplice script PHP in cui tutto può stare in un unico file, Laravel adotta l'architettura MVC (Model-View-Controller) e segue rigorosi standard di organizzazione.
Perché Laravel ha così tante cartelle? La risposta è semplice: separazione delle responsabilità. In un progetto professionale, non puoi permettere che la logica di business, la gestione del database e l'interfaccia utente siano mescolate. Questa organizzazione permette a team di sviluppatori di lavorare contemporaneamente su parti diverse dell'app senza sovrascrivere il lavoro altrui e rende la manutenzione del codice infinitamente più semplice nel lungo periodo.
In questa lezione esploreremo ogni singola cartella, spiegando non solo cosa contiene, ma perché esiste e quando dovrete interagire con essa.
La Cartella app: Il Cuore dell'Applicazione
La directory app è dove passerete l'80% del vostro tempo. Qui risiede l'intera logica di business della vostra applicazione.
I Controller
Dentro app/Http/Controllers, troverete i file che gestiscono le richieste degli utenti. Il Controller agisce come un "vigile urbano": riceve la richiesta dal browser, chiede i dati necessari al Model e decide quale View mostrare all'utente.
I Model
La cartella app/Models contiene le classi che rappresentano le tabelle del vostro database. Grazie a Eloquent ORM, Laravel trasforma ogni riga del database in un oggetto PHP, permettendovi di interagire con i dati senza scrivere query SQL complesse a mano.
Middleware e Provider
- Middleware: Situati in
app/Http/Middleware, sono filtri che la richiesta deve attraversare prima di raggiungere il controller (es. verificare se l'utente è loggato). - Providers: In
app/Providers, troviamo le classi che "avviano" i vari servizi di Laravel all'avvio dell'app.
Ecco un esempio di come potrebbe apparire un Controller semplice per gestire un blog:
<?php
namespace App\\Http\\Controllers;
use App\\Models\\Post;
use Illuminate
outing\\Controller;
use Illuminate
equest\\Request;
class PostController extends Controller
{
// Metodo per mostrare tutti i post
public function index()
{
// Recuperiamo tutti i post dal database tramite il Model
$posts = Post::all();
// Restituiamo la vista 'posts.index' passando i dati
return view('posts.index', ['posts' => $posts]);
}
}
In questo esempio, vediamo come il Controller faccia da ponte tra il Model (Post::all()) e la View (view('posts.index')).
Routing e Configurazione: routes e config
La cartella routes
Se app è il cuore, routes è il sistema nervoso. Qui definite tutti gli URL della vostra applicazione.
web.php: Contiene le rotte per l'interfaccia web (gestisce sessioni, cookie e CSRF).api.php: Utilizzato per creare API REST, dove le risposte sono tipicamente in formato JSON.console.php: Per definire comandi personalizzati da lanciare da terminale.
La cartella config
In config, troverete file PHP che restituiscono array di impostazioni. Qui potete configurare la coda di messaggi, i servizi di posta elettronica, l'autenticazione e molto altro. Tuttavia, i valori sensibili (come le password del database) non vengono scritti qui, ma nel file .env alla radice del progetto, per motivi di sicurezza.
L'Interfaccia Utente: resources e public
La cartella resources
Qui risiede tutto ciò che è "grezzo" e deve essere elaborato prima di arrivare al browser.
views: Contiene i file con estensione.blade.php. Blade è il potente motore di template di Laravel che permette di usare cicli e condizioni direttamente nell'HTML.cssejs: Contengono i file sorgente (spesso in SASS o TypeScript) che verranno poi compilati tramite Vite o Laravel Mix.
La cartella public
Questa è l'unica cartella accessibile pubblicamente dal web. Contiene il file index.php (il punto di ingresso dell'app), le immagini, i file CSS e JS compilati. Per sicurezza, il server web deve puntare a questa cartella, proteggendo così tutto il resto del codice sorgente.
Vediamo come creare una vista semplice in resources/views/welcome.blade.php:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Benvenuti nel mio Blog</title>
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
</head>
<body>
<h1>Ciao, {{ $userName }}!</h1>
<p>Benvenuto nella mia applicazione Laravel.</p>
</body>
</html>
Nota l'uso delle doppie graffe {{ }}: questo è il linguaggio Blade che permette di stampare variabili PHP in modo sicuro, prevenendo attacchi XSS (Cross-Site Scripting).
Database e Automazione: database e tests
La cartella database
Laravel non richiede che creiate le tabelle manualmente tramite phpMyAdmin. Utilizza due strumenti fondamentali:
- Migrations (
database/migrations): Versioning per il vostro database. Definendo la struttura in PHP, potete ricreare il database su qualsiasi macchina con un comando. - Seeders e Factories (
database/seeders): Utilizzati per popolare il database con dati di prova (es. creare 100 utenti fake per testare la paginazione).
La cartella tests
Il software professionale richiede test. In tests/Feature e tests/Unit, potete scrivere script che verificano automaticamente se le vostre funzionalità funzionano correttamente dopo ogni modifica.
Ecco un esempio di una Migration per creare una tabella posts:
<?php
use Illuminate\\Database\\Migrations\\Migration;
use Illuminate\\Database\\Schema\\Blueprint;
use Illuminate\\Support\\Facades\\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id(); // ID auto-incrementante
$table->string('title'); // Colonna VARCHAR per il titolo
$table->text('content'); // Colonna TEXT per il corpo del post
$table->timestamps(); // Crea created_at e updated_at
});
}
public function down()
{
Schema::dropIfExists('posts');
}
};
Le migrations permettono di mantenere il database sincronizzato tra tutti i membri del team di sviluppo.
Esempi Pratici: Il Ciclo di Vita di una Richiesta
Per capire davvero a cosa servono queste cartelle, seguiamo il percorso di una richiesta utente che vuole vedere un articolo del blog (/blog/mio-articolo):
public/index.php: La richiesta arriva qui per prima.routes/web.php: Laravel controlla quale rotta corrisponde a/blog/{slug}e vede che deve chiamare ilPostController@show.app/Http/Controllers/PostController.php: Il metodoshowviene eseguito. Il controller chiede al Model i dati.app/Models/Post.php: Il Model interroga il database e restituisce l'oggetto Post.resources/views/posts/show.blade.php: Il controller passa l'oggetto Post alla vista, che genera l'HTML finale.- Risposta: L'HTML viene inviato al browser dell'utente.
Errori Comuni e FAQ
Perché non trovo i miei file CSS in public?
Molti principianti scrivono CSS in resources/css e si chiedono perché non vengano caricati. Ricordate: il browser vede solo ciò che è in public. Dovete usare un compilatore (come Vite) per spostare e ottimizzare i file da resources a public.
Dove devo mettere le immagini?
Le immagini statiche (logo, icone) vanno in public/images. Se invece le immagini sono caricate dagli utenti, vanno in storage/app/public e poi collegate alla cartella public tramite il comando php artisan storage:link.
Posso creare nuove cartelle in app?
Certamente! Se la vostra applicazione diventa enorme, potete creare sottocartelle (es. app/Services o app/Repositories) per organizzare meglio la logica complessa. Laravel non vi obbliga a restare solo nei Controller.
Prossimi Passi
Ora che avete una mappa chiara della struttura di Laravel, siete pronti per sporcarvi le mani. La teoria è fondamentale, ma la programmazione si impara scrivendo codice.
Cosa fare ora:
- Aprite il vostro editor (consigliato VS Code con estensioni per Laravel).
- Provate a creare un nuovo Controller usando il terminale:
php artisan make:controller TestController. - Verificate in quale cartella è stato creato il file: dovreste trovarlo in
app/Http/Controllers. - Create una rotta semplice in
routes/web.phpche richiami quel controller.
Nella prossima lezione, approfondiremo il sistema di Routing, imparando a creare URL dinamici e a gestire i parametri per rendere il vostro sito interattivo!