'Laravel edit route for basic CRUD application giving 404

I'm trying to set up a basic Laravel 9 CRUD application, and I cannot get the edit route working for the User Controller.

routes/web.php

Route::get('/dashboard', function () { return view('dashboard'); })
    ->middleware(['auth'])->name('dashboard');

use App\Http\Controllers\UserController;

Route::controller(UserController::class)->group(function(){
    Route::get('user','index')->middleware('auth')->name('cases');
    Route::get('user/create','create')->middleware('auth');
    Route::post('user/create','store')->middleware('auth');
    Route::get('user/{$id}/edit','edit')->middleware('auth');
    Route::post('user/{$id}/edit','update')->middleware('auth');
    Route::get('user/{$id}/delete','destroy')->middleware('auth');
    Route::get('user/{id}','show')->middleware('auth');
});

require __DIR__.'/auth.php';

UserController.php

class UserController extends Controller
{
    function edit(int $id)
    {
        echo 123;
    }

I'm getting a 404 NOT FOUND page

enter image description here

Also, why don't I see the stack trace for this error?

Also, in some examples, I've seen people using the model class name as the parameter type in the controller method declaration, such as:

function edit(User $id)
{
    echo 123;
}

However, I've also seen other examples using int instead. So which is the correct one?



Solution 1:[1]

Parameters in routes don't take a starting $. Change all occurrences of {$id} in your routes to just {id}:

Route::controller(UserController::class)->group(function(){
    Route::get('user','index')->middleware('auth')->name('cases');
    Route::get('user/create','create')->middleware('auth');
    Route::post('user/create','store')->middleware('auth');
    Route::get('user/{id}/edit','edit')->middleware('auth');
    Route::post('user/{id}/edit','update')->middleware('auth');
    Route::get('user/{id}/delete','destroy')->middleware('auth');
    Route::get('user/{id}','show')->middleware('auth');
});

More on Route Parameters

Edit: you might also want to take a look at Resource Controllers. Something like Route::resource('users', UserController::class); will manage all of the required routes

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 brombeer