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
  • πŸ” 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

  • Laravel Routing Documentation
  • File modificato: routes/i40.php`
  • Data fix: 2025-10-17

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