Laravel 4中找不到控制器类

时间:2014-08-02 20:21:02

标签: php laravel laravel-4 laravel-routing

尝试运行控制器时出现以下错误

  

未找到控制器类

我的routes.php文件

中有此代码
Route::get('cms/create-page', 'AdminCMSController@create_page');
Route::post('cms/createpage','AdminCMSController@createpage');
Route::controller('cms','AdminCMSController');

这是我的控制器中的代码

class AdminCMSController extends BaseController {
    public function create_page() {
    }

    public function createpage() {
    }
}

我该如何解决?

1 个答案:

答案 0 :(得分:11)

如果您没有从原始位置(controllers)移动«project_root»/app/controllers/目录,则必须保证:

  1. Laravel的自动加载有controller目录。导航至«project_root»/app/start/global.php。你需要有这样的东西:

    (...)
    ClassLoader::addDirectories(array(
        app_path().'/commands',
        app_path().'/controllers',
        app_path().'/models',
        app_path().'/database/seeds',
    ));
    (...)
    

    注意这一行app_path().'/controllers'。它必须存在。

  2. 此外,打开composer.json文件并验证是否存在以下行:

    (...)
    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ],
    (...)
    

    确保您拥有app/controllers

  3. 如果您有这些行并且仍然收到相同的消息,请转到项目根目录并从命令行composer dumpautoload -o运行以下命令。

    Laravel与Composer一起使用,see composer docs是PHP的依赖管理工具。它还为所有项目类(PSR-0)准备自动加载文件。运行composer dumpautoload命令时,它将在«project_root»/vendor/composer中创建一些文件。

    确保您可以在文件AdminCMSController中找到课程«project_root»/vendor/composer/autoload_classmap.php。你应该看到这样的东西:

    'AdminCMSController' => $baseDir . '/app/controllers/AdminCMSController.php',
    

    如果您更改了controllers目录的默认位置,则必须执行以下任一步骤。但是,由于您没有在类中定义命名空间,因此这似乎不是您的问题所在:

    1. 使用Refer to the wikipedia进行自动加载课程。想象一下,您有以下文件夹结构:

      /app
          /commands
          /config
          /database
          /Acme
              /controllers
      

      您必须在Acme中指定composer.json文件夹,如下所示:

      "autoload": {
          "classmap": [
              "app/commands",
              "app/database/migrations",
              "app/database/seeds",
              "app/tests/TestCase.php"
          ],
          "psr-0": {
              "Acme": "app/"
          }
      },
      

      在此之后,您需要使用命令composer dumpautoload更新作曲家自动加载文件。

    2. 如果您不想使用PSR-0进行自动加载,则需要从此处更改路径文件

      Route::controller('cms','AdminCMSController');
      

      到此:

      Route::controller('cms','Acme\controllers\AdminCMSController');
      
    3. 如果你使用PSR-0,你需要像这样命名你的类:

      <?php namespace Acme\controllers;
      
      class AdminCMSController extends BaseController {
      (...)
      }
      

      Acme引用感到好奇吗?我也是。 {{3}}