'Class App\Http\Controllers\UserController Does Not Exist

Having the issue when loading the route /users or /user/add and being return an error of;

ReflectionException in Route.php line 280: Class App\Http\Controllers\App\Controllers\UserController does not exist

The UserController does exist and it is not in a folder within my controllers folder.

My route file;

Route::group(['middleware' => 'auth'], function(){
    Route::get('/route/selector', 'PagesController@selectRoute');

    // Admin Only //
    Route::group(['middleware' => 'isAdmin'], function(){
        Route::get('/admin', 'AdminController@index');

        Route::get('/users', 'UserController@index');
        Route::get('/user/add', 'UserController@getAdd');
        Route::post('/user/add', 'UserController@postAdd');
        Route::get('/user/edit/{id}', 'UserController@getEdit');
        Route::post('/user/edit/{id}', 'UserController@postEdit');
        Route::get('/user/delete/{id}', 'UserController@delete');
    });
});

My UserController;

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use App\User;
use App\UserTypes;

use Auth;
use Hashids;
use Redirect;
use Request;
use Hash;

class UserController extends Controller
{
    public function index(){
        $users = User::get();
        return view('users.index', compact('users'));
    }

    public function getAdd(){
        $user_type = UserTypes::pluck('user_type', 'id');
        return view('users.add', compact('user_type'));
    }

    public function postAdd(){
        $input = Request::all();
        $password = str_random(8);
        User::create(
            'email' => $input['email'],
            'password' => Hash::make($password),
            'first_name' => $input['first_name'],
            'surname' => $input['surname'],
            'phone_number' => $input['phone_number'],
            'user_type' => $input['user_type'],
        );

        return Redirect::action('UserController@index');
    }

    public function getEdit($id){

    }

    public function postEdit($id){

    }

    public function delete($id){
        User::find(current(Hashids::decode($id)))->delete();
        return Redirect::action('UserController@index');
    }

}

When I remove the User::create(); part the error disappears, will it have something to do with this?



Solution 1:[1]

Laravel 8.x update has a different way of using routes.

Previously it was:

Route::get('/', 'PagesController@index');

Now it has changed to

Route::get('/',[PagesController::class, 'index']);

Note: don't forget to import (use) your controller in the routes(web.php) file at the top. Like:

use App\Http\Controllers\PagesController;

Solution 2:[2]

Replace this code

Route::group(['middleware' => 'isAdmin'], function(){
    Route::get('/admin', 'AdminController@index');

    Route::get('/users', 'UserController@index');
    Route::get('/user/add', 'UserController@getAdd');
    Route::post('/user/add', 'UserController@postAdd');
    Route::get('/user/edit/{id}', 'UserController@getEdit');
    Route::post('/user/edit/{id}', 'UserController@postEdit');
    Route::get('/user/delete/{id}', 'UserController@delete');
});

with this

Route::group(['middleware' => 'isAdmin'], function(){
    Route::get('/admin', 'AdminController@index');
    Route::group(['namespace' => YOUR_NAMESPACE], function(){
        Route::get('/users', 'UserController@index');
        Route::get('/user/add', 'UserController@getAdd');
        Route::post('/user/add', 'UserController@postAdd');
        Route::get('/user/edit/{id}', 'UserController@getEdit');
        Route::post('/user/edit/{id}', 'UserController@postEdit');
        Route::get('/user/delete/{id}', 'UserController@delete');
    });
});

& in your UserController you should correct your namespace also

e.g your UserController resides in app/Controllers directory then your UserController will be like this

<?php

namespace App\Controllers;

use App\Http\Requests;
use App\User;
use App\UserTypes;

use Auth;
use Hashids;
use Redirect;
use Request;
use Hash;

class UserController extends Controller
{
    public function index(){
        $users = User::get();
        return view('users.index', compact('users'));
    }

    public function getAdd(){
        $user_type = UserTypes::pluck('user_type', 'id');
        return view('users.add', compact('user_type'));
    }

    public function postAdd(){
        $input = Request::all();
        $password = str_random(8);
        User::create(
            'email' => $input['email'],
            'password' => Hash::make($password),
            'first_name' => $input['first_name'],
            'surname' => $input['surname'],
            'phone_number' => $input['phone_number'],
            'user_type' => $input['user_type'],
        );

        return Redirect::action('UserController@index');
    }

    public function getEdit($id){

    }

    public function postEdit($id){

    }

    public function delete($id){
        User::find(current(Hashids::decode($id)))->delete();
        return Redirect::action('UserController@index');
    }

}

& your route will be like this

Route::group(['middleware' => 'auth'], function(){
    Route::get('/route/selector', 'PagesController@selectRoute');

    // Admin Only //
    Route::group(['middleware' => 'isAdmin'], function(){
        Route::get('/admin', 'AdminController@index');
        Route::group(['namespace' => '\App\Controllers'], function(){
            Route::get('/users', 'UserController@index');
            Route::get('/user/add', 'UserController@getAdd');
            Route::post('/user/add', 'UserController@postAdd');
            Route::get('/user/edit/{id}', 'UserController@getEdit');
            Route::post('/user/edit/{id}', 'UserController@postEdit');
            Route::get('/user/delete/{id}', 'UserController@delete');
        });
    });
});

Solution 3:[3]

The create method is missing the array brackets.

User::create([
    'email' => $input['email'],
    'password' => Hash::make($password),
    'first_name' => $input['first_name'],
    'surname' => $input['surname'],
    'phone_number' => $input['phone_number'],
    'user_type' => $input['user_type'],
]);

Solution 4:[4]

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index]);

Laravel 8 has updated the route format. The above route will only only for Laravel 8 or higher. If your Laravel version is less than 8 try using:

Route::get('/user', 'UserController@index');

Solution 5:[5]

Laravel 8 updated the Route format, please try the updated format on controllers routes.

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);

Fixed.

Solution 6:[6]

Don't forget to add this line to your controller

use App\Http\Controllers\Controller;

If this is not present in your controller your controller is not able to extend the features of the main Laravel controller prototypes

Solution 7:[7]

this happen because you are missing Controller class which has extends for it and others reasons depended on your actions.

to solve this problem you need to use Controller class in your UserController.

use App\Http\Controllers\Controller;

or you can easily avoiding that be type on the console

php artisan make:controller UserController

that will solving the problem.

Solution 8:[8]

Actually You are getting 2 errors, the last one gets shown on the top of the page, and that error is that the controller does not exist. The reason why you are seeing that error is because the Model::create() method expects an array of attributes, whilst you are calling it with separate arguments instead.

Try:

$user = User::create([
    'email' => $input['email'],
    'password' => Hash::make($password),
    'first_name' => $input['first_name'],
    'surname' => $input['surname'],
    'phone_number' => $input['phone_number'],
    'user_type' => $input['user_type'],
]);

Solution 9:[9]

Route::get('/', 'api\AppController@appInfo');

I created AppController in controller/api folder so this is my path. You need to give path till your controller.

Solution 10:[10]

DOCS Laravel 8.x controllers#resource-controllers

On file routes/web.php

use App\Http\Controllers\UserController; and then Route::resource('user',UserController::class);

Solution 11:[11]

in laravel 8 do the following remove the comment from RouteServiceProvider.php First of all Open RouteServiceProvider.php located at app\Providers\RouteServiceProvider.php

Now remove comment of following line.

protected $namespace = 'App\Http\Controllers';

Solution 12:[12]

The best solution for this problem is to open the file "Providers/RouteServiceProvider" and edit it. But, first, add it to the RouteServiceProvider class.

protected $namespace = 'App\Http\Controllers';

Next, in the boot() function.

$this->configureRateLimiting();

$this->routes(function () {
    Route::middleware('api')
        ->prefix('api')
        ->group(base_path('routes/api.php'));
    Route::namespace($this->namespace)
        ->middleware('web')
        ->group(base_path('routes/web.php'));
    Route::namespace($this->namespace)
        ->middleware('web')
        ->group(base_path('routes/dashboard.php'));
})