In this example, we will address the issue of "Target class does not exist" in Laravel 8, with the information also applicable to Laravel 9 and 10. Laravel 8 introduces numerous changes and updates, and many users have encountered an issue when defining routes in their web.php file. This issue manifests as an exception message such as "Target class [postController] does not exist."
Common variations of this error message include "Illuminate\Contracts\Container\BindingResolutionException: Target class does not exist," "Laravel target class does not exist," "Target class App\Http\Middleware\HandleInertiaRequests does not exist," "Target class (PostController) does not exist," and "Controller does not exist Laravel 8."
In this tutorial, we will explore solutions to resolve the "Target class does not exist" issue in Laravel 8, offering valuable troubleshooting techniques for Laravel 9 and 10 as well.
Up until Laravel 7, the RouteServiceProvider.php file contained the following code, where the namespace variable stored 'App\Http\Controllers' and was declared within middleware and prefix route configurations
protected $namespace = 'App\Http\Controllers';
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
However, in Laravel 8, the $namespace
variable was removed, and the Route declaration was altered as follows:
protected $namespace = null;
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
});
}
So, here are two different solutions for the "Target Class Does Not Exist" issue.
In this process, you need to assign a value or path to the $namespace
variable and declare it in the route, as shown below.
protected $namespace = 'App\Http\Controllers';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
});
}
Now, you can run your application again, and all the codes should work without encountering the "Target Class Does Not Exist" error.
In this solution, you have the option to use the full namespace or modify all your route declarations as shown in the following code:
Route::resource('posts','App\Http\Controllers\PostController');
Here, you need to provide the full path of your controller.
You might also like: