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.
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
protectedoprivatei 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
0
Cancella like
0
Amore
0
Buffo
0
arrabbiato
0
Sad
0
Wow
0