Fix: 404 su Route Specifiche (Route Order)
Fix: 404 su Route Specifiche (Route Order)
π Problema
Accedendo a una route specifica come /admin/i40/machines/connected si ottiene un errore 404, anche se la route Γ¨ correttamente definita nel file delle route.
Sintomi
- La route Γ¨ definita nel file
routes/i40.php - Il controller ha il metodo corretto
- La view esiste
- Ma Laravel restituisce 404
- Laravel Routing Documentation
- File modificato: routes/i40.php`
- Data fix: 2025-10-17
π Causa
Ordine errato delle route. Laravel valuta le route nell'ordine in cui sono definite. Se una route con parametro wildcard (come /{machine}) viene prima di una route specifica (come /connected), il wildcard cattura tutte le richieste.
Esempio Problematico
``php
Route::prefix('machines')->name('machines.')->group(function () {
Route::get('/', [MachinesController::class, 'index'])->name('index');
Route::get('/{machine}', [MachinesController::class, 'show'])->name('show'); // β Questa cattura "/connected"!
Route::get('/connected', [MachinesController::class, 'connected'])->name('connected'); // β Mai raggiunta!
});
`
Quando accedi a /machines/connected:
1. Laravel valuta /{machine} e fa match con machine = "connected"
2. Cerca una macchina con ID "connected"
3. Non la trova β 404
4. Non arriva mai alla route /connected
β Soluzione
Spostare le route specifiche PRIMA delle route con parametri wildcard:
`php
Route::prefix('machines')->name('machines.')->group(function () {
Route::get('/', [MachinesController::class, 'index'])->name('index');
// β
Route specifiche PRIMA
Route::get('/connected', [MachinesController::class, 'connected'])->name('connected');
Route::get('/create', [MachinesController::class, 'create'])->name('create');
Route::get('/api/list', [MachinesController::class, 'apiIndex'])->name('api.index');
// β
Route con parametri DOPO
Route::get('/{machine}', [MachinesController::class, 'show'])->name('show');
Route::get('/{machine}/edit', [MachinesController::class, 'edit'])->name('edit');
Route::put('/{machine}', [MachinesController::class, 'update'])->name('update');
Route::delete('/{machine}', [MachinesController::class, 'destroy'])->name('destroy');
Route::get('/{machine}/api', [MachinesController::class, 'apiShow'])->name('api.show');
Route::post('/{machine}/repair-paths', [MachinesController::class, 'repairPaths'])->name('repair.paths');
});
`
π Regole Generali per l'Ordine delle Route
β Ordine Corretto
1. Route esatte senza parametri (piΓΉ specifiche)
`php
Route::get('/', [Controller::class, 'index']);
Route::get('/connected', [Controller::class, 'connected']);
Route::get('/create', [Controller::class, 'create']);
Route::get('/api/list', [Controller::class, 'apiIndex']);
`
2. Route con parametri e suffissi (meno specifiche)
`php
Route::get('/{machine}/edit', [Controller::class, 'edit']);
Route::get('/{machine}/api', [Controller::class, 'apiShow']);
`
3. Route con solo parametri (meno specifiche di tutte)
`php
Route::get('/{machine}', [Controller::class, 'show']);
`
β Errori Comuni
`php
// β SBAGLIATO
Route::get('/{id}', ...); // Troppo generale, viene prima
Route::get('/create', ...); // Mai raggiunta!
// β
CORRETTO
Route::get('/create', ...); // Specifica, viene prima
Route::get('/{id}', ...); // Generale, viene dopo
`
π§ͺ Come Verificare
Per vedere l'ordine delle route nel tuo progetto:
`bash
php artisan route:list --name=admin.i40.machines
`
Output corretto:
`
GET|HEAD admin/i40/machines .................. admin.i40.machines.index
GET|HEAD admin/i40/machines/connected ......... admin.i40.machines.connected
GET|HEAD admin/i40/machines/create ............ admin.i40.machines.create
GET|HEAD admin/i40/machines/{machine} ......... admin.i40.machines.show
`
π Reference
Analisi Codice
Blocco 1 php
Route::prefix('machines')->name('machines.')->group(function () {
Route::get('/', [MachinesController::class, 'index'])->name('index');
Route::get('/{machine}', [MachinesController::class, 'show'])->name('show'); // β Questa cattura "/connected"!
Route::get('/connected', [MachinesController::class, 'connected'])->name('connected'); // β Mai raggiunta!
});
Blocco 2 php
Route::prefix('machines')->name('machines.')->group(function () {
Route::get('/', [MachinesController::class, 'index'])->name('index');
// β
Route specifiche PRIMA
Route::get('/connected', [MachinesController::class, 'connected'])->name('connected');
Route::get('/create', [MachinesController::class, 'create'])->name('create');
Route::get('/api/list', [MachinesController::class, 'apiIndex'])->name('api.index');
// β
Route con parametri DOPO
Route::get('/{machine}', [MachinesController::class, 'show'])->name('show');
Route::get('/{machine}/edit', [MachinesController::class, 'edit'])->name('edit');
Route::put('/{machine}', [MachinesController::class, 'update'])->name('update');
Route::delete('/{machine}', [MachinesController::class, 'destroy'])->name('destroy');
Route::get('/{machine}/api', [MachinesController::class, 'apiShow'])->name('api.show');
Route::post('/{machine}/repair-paths', [MachinesController::class, 'repairPaths'])->name('repair.paths');
});
Blocco 3 php
Route::get('/', [Controller::class, 'index']);
Route::get('/connected', [Controller::class, 'connected']);
Route::get('/create', [Controller::class, 'create']);
Route::get('/api/list', [Controller::class, 'apiIndex']);
Blocco 4 php
Route::get('/{machine}/edit', [Controller::class, 'edit']);
Route::get('/{machine}/api', [Controller::class, 'apiShow']);
Blocco 5 php
Route::get('/{machine}', [Controller::class, 'show']);
Blocco 6 php
// β SBAGLIATO
Route::get('/{id}', ...); // Troppo generale, viene prima
Route::get('/create', ...); // Mai raggiunta!
// β
CORRETTO
Route::get('/create', ...); // Specifica, viene prima
Route::get('/{id}', ...); // Generale, viene dopo
Blocco 7 bash
php artisan route:list --name=admin.i40.machines
Blocco 8
GET|HEAD admin/i40/machines .................. admin.i40.machines.index
GET|HEAD admin/i40/machines/connected ......... admin.i40.machines.connected
GET|HEAD admin/i40/machines/create ............ admin.i40.machines.create
GET|HEAD admin/i40/machines/{machine} ......... admin.i40.machines.show