If you have been working in Laravel 5, you may know all your Controller classes are in app/Http/Controllers folder. And if you have newely started working or upgrading on Laravel 8 latest version, you  might get error "Target class controller does not exist"

This is becuase in Laravel 8, the default folder for Controllers class is changed to app folder. To see default paths for Laravel controllers and routes, open app/Providers/RouteServiceProvider.php file. In the mapWebRoutes() function you can see:

Route::middleware('web')
    ->namespace($this->namespace)
    ->group(base_path('routes/web.php'));

You can see namespace variable is commented in the Laravel 8 application. This means all your Controllers class base path counted in app folders.

/**
 * This namespace is applied to your controller routes.
 *
 * In addition, it is set as the URL generator's root namespace.
 *
 * @var string
 */
// protected $namespace = 'App\Http\Controllers';

Solution

In Laravel 8, developThere are few solutions of this.

1. This is the simple way to solve the issue if you are upgrading project. Simply remove the comment of namespace variable from app/Providers/RouteServiceProvider.php file. This will make your Controllers class default folder to app/Http/Controllers

/**
 * This namespace is applied to your controller routes.
 *
 * In addition, it is set as the URL generator's root namespace.
 *
 * @var string
 */
protected $namespace = 'App\Http\Controllers';

2. Provide full path in routes/web.php

<?php

Route::get('welcome', 'App\Http\Controllers\HomeController@home');

3. Using class name in routes/web.php

<?php

use App\Http\Controllers\HomeController;

Route::get('welcome', [HomeController::class, 'home']);

I hope this will help you on your initial Laravel 8 setups.


Was this article helpful?

0 out of 0 person found this article helpful.

Leave a comment

OR

No Comments