Laravel:控制器不存在

问题描述 投票:0回答:15

我在 /app/controllers/admin/ 文件夹中添加了新控制器,并在 /app/routes.php 文件中添加了路由。然后我运行以下命令来自动加载它们

php artisan dump-autoload

我收到以下错误

Mcrypt PHP extension required.

我按照 https://askubuntu.com/questions/460837/mcrypt-extension-is-missing-in-14-04-server-for-mysql 给出的说明进行操作,并能够解决 mcrypt 问题。

之后我运行

php artisan dump-autoload
命令但仍然出现以下错误

{"error":{"type":"ReflectionException","message":"Class CoursesController does not exist","file":"\/var\/www\/html\/vendor\/laravel\/framework\/src\/Illuminate\/Container\/Container.php","line":504}}

这是我的routes.php文件的代码

Route::group(array('before' => 'adminauth', 'except' => array('/admin/login', '/admin/logout')), function() {
    Route::resource('/admin/courses', 'CoursesController');
    Route::resource('/admin/teachers', 'TeachersController');    
    Route::resource('/admin/subjects', 'SubjectsController');
});

这是CoursesController.php文件的代码

<?php

class CoursesController extends BaseController
{

    public function index()
    {
        $courses = Course::where('is_deleted', 0)->get();
        return View::make('admin.courses.index', compact('courses'));
    }

    public function create()
    {
        return View::make('admin.courses.create');
    }

   public function store()
    {
        $validator = Validator::make($data = Input::all(), Course::$rules);

        if ($validator->fails()) {
            $messages = $validator->messages();
            $response = '';
            foreach ($messages->all(':message') as $message) {
                $response = $message;
            }
            return Response::json(array('message'=>$response, 'status'=>'failure'));
        } else {
            Course::create($data);
            return Response::json(array('message'=>'Course created successfully','status'=>'success'));
        }
    }

    public function edit($id)
    {
        $course = Course::find($id);
        return View::make('admin.courses.edit', compact('course'));
    }

    public function update($id)
    {
        $course = Course::findOrFail($id);
        $validator = Validator::make($data = Input::all(), Course::editRules($id));

        if ($validator->fails()) {
            $messages = $validator->messages();
            $response = '';
            foreach ($messages->all(':message') as $message) {
                $response = $message;
            }
            return Response::json(array('message'=>$response, 'status'=>'failure'));
        } else {
            $course->update($data);
            return Response::json(array('message'=>'Course updated successfully','status'=>'success'));
        }
    }

    public function destroy($id)
    {
        Course::findOrFail($id)->update(array('is_deleted' => '1'));
        return Response::json(array('message'=>'Course deleted successfully','status'=>'success'));
    }

}
laravel-4 controller autoload
15个回答
17
投票

您是否将自动加载类映射添加到composer.json文件中? 打开你的composer.json文件并添加

"autoload": {
        "classmap": [
            "app/controllers/admin",
        ]
    }

如果在控制器中添加文件夹,则需要将其添加到composer.json文件中。然后运行

composer dumpautoload

或替代方案

转到 app/start/global.php 并添加

ClassLoader::addDirectories(array(
    app_path().'/controllers/admin',
));

11
投票

2021 年答案(Laravel 8.5)

在您的控制器中;

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;

class AuthController extends Controller
{
    public function login(Request $request){
        return "login";
    }
}

在您的路线中;

use App\Http\Controllers\AuthController;
Route::post('/login', [AuthController::class, 'login']);

文档 = https://laravel.com/docs/8.x/routing#the-default-route-files


9
投票

就我而言,在控制器代码的顶部我添加了这一行:

命名空间 App\Http\Controllers\CustomFolder\ControllerClassName;

我的问题解决了


8
投票

我们可以通过命令行创建控制器。

php artisan make:controller nameController --plain
.

在 Laravel 5 之前,make 命名空间不可用。相反,这有效

php artisan controller:make nameController

在项目目录中执行命令,然后创建函数。


6
投票

别忘了做:

php artisan route:clear

就我而言,这是我在更改路线代码后收到此错误时的解决方案。


6
投票

就我而言,我必须更改路由文件:

Route::get('/','SessionController@accessSessionData');

对此:

Route::get('/','App\Http\Controllers\SessionController@accessSessionData');

然后用这个清除缓存:

php artisan route:clear

让一切顺利进行。


5
投票

有点晚了,但根据我的经验,将其添加到 RouteServiceProvider.php 可以解决问题

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

3
投票

我想你的问题已经解决了。但这就是所做的。

结构

Http
  .Auth
  .CustomControllerFolder
    -> CustomController.php

让这个工作 在您的路由文件中确保使用正确的名称空间 例如:

  Route::group(['namespace'=>'CustomControllerFolder','prefix'=>'prefix'],
      function() {

   //define your route here
}

另外不要忘记在控制器中使用

namespace App\Http\Controllers\CustomControllerFolder

这应该可以解决问题。

谢谢


2
投票

我刚刚遇到这个问题,因为我将文件从

EmployeeRequestContoller
重命名为
EmployeeRequestsContoller
,但是当我重命名它时,我错过了
.php
扩展名!

当我重新运行

php artisan make:controller EmployeeRequestsContoller
只是为了确保我没有发疯并且文件出现时,我可以清楚地看到错误:

/EmployeeRequestsContoller
/EmployeeRequestsContoller.php

如果您已重命名,请确保您拥有扩展名!


2
投票

我使用 Laravel 9,这就是我们使用控制器的方式

use App\Http\Controllers\UserController;
 
Route::get('/user', [UserController::class, 'index']);

0
投票

有时我们在控制器代码之上缺少

namespace App\Http\Controllers;


0
投票

就我而言,我有几个管理和家庭控制器的备份文件,用不同的日期重命名,我们在其上运行了作曲家更新,它给了我们一个错误

在我删除其他较旧的控制器文件并重新运行作曲家更新后解决了我的问题。


 - Clue - composer update command gave us a warning.

生成优化的自动加载文件

Warning: Ambiguous class resolution, "App\Http\Controllers\HomeController" was found in both "app/core/app/Http/Controllers/HomeController(25-OCT).php" and "app/core/app/Http/Controllers/HomeController.php", the first will be used.

Warning: Ambiguous class resolution, "App\Http\Controllers\AdminController" was found in both "app/core/app/Http/Controllers/AdminController(25-OCT).php" and "app/core/app/Http/Controllers/AdminController.php", the first will be used.

0
投票

在内部使用完整的命名空间

web.php

Route::resource('myusers','App\Http\Controllers\MyUserController');

0
投票

此格式解决了最新版本的问题

   Route::post('decline', [UserController::class, 'decline'])->name('user.decline');

0
投票

我遇到过这个问题,我发现我在命名时犯了一个愚蠢的错误,因此为了确保您没有任何命名问题,请检查名称:

1-

web.php
api.php

2- 文件名

YourController.php
:

3- 类的名称

class YourController extends 
控制器{}`

api.php:

use DommyController;
Route::get('dommy-route', DommyController::class, 'dommyFunction']);

DommyController.php:

use App\Http\Controllers\Controller;
class DommyController extends Controller
{
    public function index
    {
        return 'test';
    }
}

api.php
web.php
中,如果您使用
'namespace'
,您应该应该使用类的正确路径

Route::group([
    'prefix' => 'v1',
    'namespace' => 'Api\V1'
], function() {
   use DommyController;
   Route::get('dommy-route', DommyController::class, 'dommyFunction']);
});
© www.soinside.com 2019 - 2024. All rights reserved.