Search code examples
laravelroute-parameters

error when try to open route without parameter in Laravel 9


I have a problem when trying to access any route without parameter:

When I wrte any route without {uname} parameter like this or any other one:

http://127.0.0.1:8000/login/

show me this error : enter image description here

and it is in the home in another controller?

These is my routes:

Route::get('/{uname?}', [HomeController::class, 'home'])->name('home');

Route::get('/info/{uname?}', [HomeController::class, 'info'])->name('info.me');

Route::get('/skills/{uname?}', [HomeController::class, 'skills'])->name('skills');

Route::get('/education/{uname?}', [HomeController::class, 'education'])->name('education');

Route::get('/achievements/{uname?}', [HomeController::class, 'achievements'])->name('achievements');

Route::get('/services/{uname?}', [HomeController::class, 'services'])->name('services');

Route::get('/contact/{uname?}', [HomeController::class, 'contact'])->name('contact');

Route::post('/send-email', [HomeController::class, 'sendEmail'])->name('send-email');

    Route::get('/dashboard/index', [DashboardController::class, 'index'])->name('dashboard.index');
    Route::resource('/dashboard/about', AboutController::class);
    Route::resource('/dashboard/skills', SkillsController::class);
    Route::resource('/dashboard/education', EducationController::class);

and here is my HomeController:

class HomeController extends Controller
{
    function home($uname) {
       $user = User::where('name', '=', $uname)->first();
       $about =  $user->about;
        return view('home', compact('user', 'about'));
    }


    function info($uname) {
        $user = User::where('name', '=', $uname)->first();
        $about =  $user->about;
        return view('info', compact(['user', 'about']));
    }

    function skills($uname) {
        $user = User::where('name', '=', $uname)->first();
        $about = $user->about;
        $skills = $user->skills;
        return view('skills', compact(['skills', 'user', 'about']));
    }

I have already tried those and nothing changed:

PHP artisan route: cache
PHP artisan cache:clear

Solution

  • Your home route is a catch-all route as you have an optional parameter right after your first dash (/). This will always catch first and stop any other routes from running because it will always match your current url. To solve this you need to put this kind of route as your last route.

    As for your error it's because your not finding any user. If ->first() doesn't find a matching row it will return null, and if it's null you will get an error if you're treating it as an object. You either need to check if $user is null and set $about based on that or use firstOrFail and then create a response for that error.