类App\Http\Controllers\UserController不存在。

21

在加载路由 /users 或 /user/add 时出现问题,并返回以下错误信息:

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

UserController 存在且不在我的控制器文件夹中的任何文件夹中。

我的路由文件如下:

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');
    });
});

我的用户控制器;

<?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');
    }

}

如果我删除User :: create();部分,错误会消失,这与此有关吗?


2
尝试运行 composer dumpauto 命令。 - Alexey Mezenin
1
你的 UserController 的路径是什么?由于你使用了 namespace App\Http\Controllers,所以它必须位于 app/Http/Controllers 目录下。 - ARIF MAHMUD RANA
谢谢你们两位,composer dumpauto 没有产生任何差异。此外,控制器位于 app/Http/Controllers 目录中。 - Kieran Headley
当我删除User :: create();部分时,错误消失了,这是否与此有关? - Kieran Headley
你忘记在顶部使用类了。 - mercury
13个回答

54

Laravel 8.x 更新后,路由的使用方式有所不同。

之前是:

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

现在已经改变为

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

注意:在路由(web.php)文件的顶部导入(使用)您的控制器。例如:

use App\Http\Controllers\PagesController;

当我将“保存移动”控制器文件(在“重构”选项下)保存到文件夹中时,我遇到了这个问题。我按照@Maz341的建议做了,但还在MyController类文件中更正了命名空间,删除了[prefix\MyController::class, '...']中的前缀(一个文件夹),并重新导入了Controller父级。然后重新启动服务器。现在一切都好了。 - CodeToLife
谢谢,我从Laravel 5回来了。很多东西都改变了。 - Rafael Parungao
在我的情况下,我在 use App\Http\Controllers\PagesController; 中使用了小写的 a。请将其转换为大写。 - ajinzrathod

5

替换这段代码

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');
});

使用这个

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');
    });
});

在你的UserController中,你需要纠正你的namespace

例如,如果你的UserController位于app/Controllers目录中,则你的UserController应该像这样:

<?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');
    }

}

你的路线将是这样的。
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');
        });
    });
});

我的用户控制器位于 app/Http/Controllers 而不是 app/Controllers,这会有影响吗?我之前建过很多 Laravel 应用程序,从未出现过这种问题。 - Kieran Headley
当我删除User :: create();部分时,错误消失了,这是否与此有关? - Kieran Headley
ReflectionException in Route.php line 280: 类 App\Http\Controllers\App\Controllers\UserController 不存在。 - Kieran Headley
@KieranHeadley,你的路由命名空间不正确。如果我看到你的“路由服务提供者”和“路由”,那么我就可以找到解决方案。暂时你可以使用我的路由部分解决方案,并将这段文本 Route::group(['namespace' => '\App\Controllers'], function(){ 替换为 Route::group(['namespace' => '\App\Http\Controllers'], function(){ - ARIF MAHMUD RANA
我的路由命名空间设置为“App\Http\Controllers”在/app/Providers/RouteServiceProvider.php文件中。 - Kieran Headley

3

create方法缺少数组括号。

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'],
]);

3
use App\Http\Controllers\UserController;

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

Laravel 8更新了路由格式。上述路由仅适用于Laravel 8或更高版本。如果您的Laravel版本小于8,请尝试使用以下方式:

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

2

请确保正确输入 use App\Http\Controllers\Controller;,因为我的错误在于错误地输入了 use App\Http\Controller\Controller;

我错把 controllers/controller 中的s省略了,而且我输入了 controller/controller,这是不正确的。


2
不要忘记在您的控制器中添加这行代码。
use App\Http\Controllers\Controller;

如果您的控制器中没有这个内容,那么您的控制器将无法扩展主要Laravel控制器原型的功能。

2

Laravel 8更新了路由格式,请在控制器路由上尝试更新的格式。

use App\Http\Controllers\UserController;

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

已修复。


0

这是因为您缺少Controller类,该类具有对其进行扩展的功能以及其他依赖于您的操作的原因。

要解决此问题,您需要在UserController中使用Controller类。

use App\Http\Controllers\Controller;

或者,你可以轻松地避免在控制台上输入错误。

php artisan make:controller UserController

那将解决这个问题。


0

实际上,您遇到了2个错误,最后一个错误显示在页面顶部,即控制器不存在。您看到该错误的原因是因为Model :: create()方法期望属性数组,而您却使用单独的参数调用它。

尝试:

$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'],
]);

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

我在 controller/api 文件夹中创建了 AppController,因此这是我的路径。你需要给出你的控制器路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接