Lezione 3 — Struttura delle cartelle di Laravel: Guida Completa per Principianti

Scopri come è organizzato un progetto Laravel. Analizziamo ogni cartella e file per capire dove scrivere il codice e come gestire l'applicazione.

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.
  • css e js: 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:

  1. Migrations (database/migrations): Versioning per il vostro database. Definendo la struttura in PHP, potete ricreare il database su qualsiasi macchina con un comando.
  2. 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):

  1. public/index.php: La richiesta arriva qui per prima.
  2. routes/web.php: Laravel controlla quale rotta corrisponde a /blog/{slug} e vede che deve chiamare il PostController@show.
  3. app/Http/Controllers/PostController.php: Il metodo show viene eseguito. Il controller chiede al Model i dati.
  4. app/Models/Post.php: Il Model interroga il database e restituisce l'oggetto Post.
  5. resources/views/posts/show.blade.php: Il controller passa l'oggetto Post alla vista, che genera l'HTML finale.
  6. 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:

  1. Aprite il vostro editor (consigliato VS Code con estensioni per Laravel).
  2. Provate a creare un nuovo Controller usando il terminale: php artisan make:controller TestController.
  3. Verificate in quale cartella è stato creato il file: dovreste trovarlo in app/Http/Controllers.
  4. Create una rotta semplice in routes/web.php che 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!