【问题标题】:Laravel: Controller does not existLaravel:控制器不存在
【发布时间】:2015-04-20 09:55:45
【问题描述】:

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

}

【问题讨论】:

  • 能否请您发布位于 CoursesController.php 中的代码
  • 我已经添加了代码。此问题属于我们的暂存服务器,但在我的本地系统上运行良好

标签: laravel-4 controller autoload


【解决方案1】:

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

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

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

composer dumpautoload

或替代

进入 app/start/global.php 并添加

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

【讨论】:

  • 问题是admin文件夹的其他控制器都在工作,但只有这个控制器不工作
  • 试试这个:扩展\BaseController
  • 它已经通过在 global.php 中添加管理文件夹来工作,但我的问题是为什么它适用于其他新添加的控制器?
  • "composer dumpautload" 应该可以工作,或者您需要“composer update”。有时我清除了 app/storage/views 文件夹并且它可以工作。
  • @anunixercoder 此解决方案适用于 Laravel 4。由于版本 4 没有使用 psr 自动加载,为了反映 composer.json 中所做的更改,您必须运行 composer dumpautoload。正如您在上面看到的,我们已将 admin 目录添加到控制器中。或者,如果您不想运行 composer dumpautoload,则可以使用替代解决方案。如果您使用 5 以上的任何版本,只要您正确命名它,您就可以在控制器中添加任意数量的目录。
【解决方案2】:

在我的例子中,在我的控制器代码的顶部我添加了这一行:

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

我的问题解决了

【讨论】:

  • 这就是原因!通常在您将控制器类移动到目录并忘记更改命名空间之后发生。谢谢! :)
【解决方案3】:

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

php artisan make:controller nameController --plain.

在 Laravel 5 之前,make namespace 不可用。相反,这有效

php artisan controller:make nameController

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

【讨论】:

  • “需要”是一个强词。 make artisan 命令只是方便的方法,你不需要使用它们
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    别忘了做:

    php artisan route:clear

    在我的情况下,这是我在更改路线代码后遇到此错误时的解决方案。

    【讨论】:

      【解决方案6】:

      我认为您的问题已经解决。但这就是事实。

      结构

      Http
        .Auth
        .CustomControllerFolder
          -> CustomController.php
      

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

        Route::group(['namespace'=>'CustomControllerFolder','prefix'=>'prefix'],
            function() {
      
         //define your route here
      }
      

      别忘了在你的控制器中使用namespace App\Http\Controllers\CustomControllerFolder

      这应该可以解决问题。

      谢谢

      【讨论】:

        【解决方案7】:

        在我的情况下,我必须从这里更改路由文件:

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

        到这里:

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

        然后用这个清除缓存:

        php artisan route:clear
        

        让事情顺利进行。

        【讨论】:

          【解决方案8】:

          我刚刚遇到了这个问题,因为我将一个文件从 EmployeeRequestContoller 重命名为 EmployeeRequestsContoller,但是当我重命名它时,我错过了 .php 扩展名!

          当我重新运行 php artisan make:controller EmployeeRequestsContoller 以确保我没有发疯并且文件显示时,我可以清楚地看到错误:

          /EmployeeRequestsContoller
          /EmployeeRequestsContoller.php
          

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

          【讨论】:

            【解决方案9】:

            有时我们在控制器代码顶部缺少namespace App\Http\Controllers;

            【讨论】:

              【解决方案10】:

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

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

              
               - 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.
              

              【讨论】:

                【解决方案11】:

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

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

                【讨论】:

                  【解决方案12】:

                  web.php中使用完整的命名空间

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

                  【讨论】:

                    猜你喜欢
                    • 2019-03-26
                    • 2014-11-11
                    • 2018-07-15
                    • 1970-01-01
                    • 2019-02-05
                    • 2015-05-23
                    • 2020-07-07
                    • 2017-09-20
                    • 2015-04-21
                    相关资源
                    最近更新 更多