'Laravel route resolving to a different method

I'm trying to set up a basic Laravel CRUD application, and I'm getting stuck setting up the pages for each action.

When I visit the route case/create, it opens the page for show instead.

routes/web.php

use App\Http\Controllers\HospitalCase as HospitalCase;

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

HospitalCase.php controller

class HospitalCase extends Controller
{
    function index()
    {
        echo 'index';
    }

    function create()
    {
        echo 'create';
    }

    function show($id)
    {
        echo 'show';
    }

    function store()
    {
        // validation rules
    }

    function edit($id)
    {
        return view('case/edit');
    }

    function update($id)
    {
    }

    function destroy($id)
    {
    }
}

This is what I see on the browser:

I have been trying to figure this out for hours and can't think of what I'm doing wrong.

PS: The auth middleware is using laravel breeze (unmodified)



Solution 1:[1]

The reason it's showing the show route is because you defined

Route::get('/case/{id}','show')->middleware('auth');

before it, therefore, it's matching case/create as show('create')

Try defining the route afterwards.

Route::get('/case/create','create')->middleware('auth');
Route::post('/case/create','store')->middleware('auth');
Route::get('/case/{id}','show')->middleware('auth');

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 IGP