Home > Net >  Laravel edit route for basic CRUD application giving 404
Laravel edit route for basic CRUD application giving 404

Time:03-02

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?

CodePudding user response:

First, inside your .env filte you should put

APP_ENV=local
APP_DEBUG=true

and change your web.php to:

<?php

use Illuminate\Support\Facades\Route;

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';

Then, try to run

php artisan route:list

and check if your routes are correct.

And try to remove middlewares inside user files, maybe you do not have login page and it redirects you there.

Be sure you are in the correct url like localhost/user/1/edit

CodePudding user response:

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

  • Related