CodeIgniter 4: routing e controller – guida pratica con esempi

Guida pratica a routing e controller in CodeIgniter 4: come definire le rotte, creare i controller, usare l'auto-routing e proteggere i metodi.

CodeIgniter 4: routing e controller – guida pratica con esempi

Dopo aver installato CodeIgniter 4, il passo successivo è capire come il framework gestisce le richieste HTTP. In questa guida vedremo come funzionano il routing e i controller, come definire le rotte in app/Config/Routes.php e come creare controller sicuri ed efficienti.

Gli esempi usano la struttura standard di CodeIgniter 4, il namespace App\Controllers e il comando php spark per le operazioni da terminale. Prima di copiare il codice, adatta namespace e percorsi al tuo progetto.

Come funziona il routing in CodeIgniter 4

In CodeIgniter 4 il routing è il meccanismo che associa un URL a un controller e a un metodo specifico. A differenza di CodeIgniter 3, dove le rotte erano un array associativo, la versione 4 utilizza un approccio orientato agli oggetti con metodi HTTP espliciti (get(), post(), put(), delete()).

Le rotte si definiscono nel file app/Config/Routes.php. La struttura di base è:

use CodeIgniter\Router\RouteCollection;

/** @var RouteCollection $routes */
$routes->get('/', 'Home::index');

In questo esempio, una richiesta GET alla root del sito viene indirizzata al metodo index() del controller Home. Il namespace predefinito App\Controllers viene anteposto automaticamente al nome del controller [citation:2].

Definire le rotte: sintassi e metodi HTTP

CodeIgniter 4 supporta tutti i principali metodi HTTP. Ecco i più comuni:

$routes->get('prodotti', 'Prodotti::lista');
$routes->post('prodotti/salva', 'Prodotti::salva');
$routes->put('prodotti/(:num)', 'Prodotti::aggiorna/$1');
$routes->delete('prodotti/(:num)', 'Prodotti::elimina/$1');

I segnaposto (:num), (:any) e (:segment) permettono di catturare porzioni di URL e passarle come parametri al metodo del controller.

Array callable syntax

Dalla versione 4.2.0 è disponibile una sintassi alternativa che migliora il supporto IDE e la navigazione del codice [citation:2]:

use App\Controllers\Home;
use App\Controllers\Prodotti;

$routes->get('/', [Home::class, 'index']);
$routes->get('prodotti', [Prodotti::class, 'lista']);

Questa forma è consigliata perché rende esplicito il namespace e facilita il refactoring.

Creare un controller

I controller si trovano nella cartella app/Controllers. Ogni controller estende BaseController, che a sua volta estende CodeIgniter\Controller [citation:6].

Ecco un controller di esempio:

 $id]);
    }
}

Il metodo index() è quello caricato di default quando l'URL non specifica un metodo. La classe BaseController fornisce un punto centralizzato per caricare componenti condivisi da tutti i controller [citation:6].

Auto-routing in CodeIgniter 4

CodeIgniter 4 supporta due modalità di auto-routing:

  • Auto Routing (Improved): sistema più sicuro e raccomandato, basato su metodi HTTP espliciti
  • Auto Routing (Legacy): mantenuto solo per compatibilità con CodeIgniter 3, sconsigliato per nuovi progetti [citation:8]

L'auto-routing è disabilitato di default. Per abilitare la versione Improved, modifica app/Config/Routing.php:

public bool $autoRoute = true;

Con l'auto-routing attivo, un URL come example.com/prodotti/lista viene mappato automaticamente sul controller Prodotti e sul metodo lista(), senza dover definire rotte esplicite [citation:6].

Attenzione: i nomi dei file dei controller devono iniziare con la lettera maiuscola e solo la prima lettera può essere maiuscola (es. Prodotti.php, non prodotti.php o PRODOTTI.php) [citation:6].

Proteggere i metodi dei controller

Per motivi di sicurezza, i metodi che non devono essere raggiungibili via URL vanno dichiarati come private o protected:

class Prodotti extends BaseController
{
    public function index()
    {
        $this->utility();
        return view('prodotti/lista');
    }

    protected function utility()
    {
        // logica interna
    }
}

Un metodo protected o private non può essere invocato tramite URL, nemmeno con l'auto-routing attivo [citation:6].

Passare parametri ai metodi

I segmenti dell'URL successivi al controller e al metodo vengono passati come parametri:

// URL: example.com/prodotti/dettaglio/42
public function dettaglio($id)
{
    return view('prodotti/dettaglio', ['id' => $id]);
}

Con le rotte esplicite, i parametri si definiscono con i segnaposto:

$routes->get('prodotti/dettaglio/(:num)', 'Prodotti::dettaglio/$1');

Rotte riservate

CodeIgniter 4 riserva alcune rotte speciali:

$routes->setDefaultController('Home');
$routes->set404Override('App\Controllers\Errori::mostra404');

La prima imposta il controller di default per la root del sito; la seconda permette di personalizzare la pagina 404.

Raccomandazioni

  • Preferisci le rotte esplicite all'auto-routing per applicazioni in produzione.
  • Usa la sintassi array callable per migliorare la leggibilità e il supporto IDE.
  • Dichiara protected o private i metodi di utilità interna.
  • Non abilitare Auto Routing (Legacy) su nuovi progetti.
  • Definisci sempre una rotta di default per evitare 404 indesiderati sulla root.

Fonti ufficiali

Share

What's Your Reaction?

Like Like 0
Cancella like Cancella like 0
Amore Amore 0
Buffo Buffo 0
arrabbiato arrabbiato 0
Sad Sad 0
Wow Wow 0