【问题标题】:Controller class not found in Laravel 4在 Laravel 4 中找不到控制器类
【发布时间】:2014-09-25 18:26:23
【问题描述】:

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

找不到控制器类

我的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() {
    }
}

我该如何解决?

【问题讨论】:

  • 没有它对所有其他控制器的工作正常,只有这个控制器有问题,如果我在路由器和控制器类中将 AdminCMSController 更改为 AdminCMS,而不是它的工作正常
  • 您提供的代码没有问题,因此您可能还有其他未显示使用的错误。
  • 没有 AdminCMSController 只有一个类,文件名为 AdminCMSController.php
  • 我检查日志文件并显示以下错误 production.ERROR: exception 'ReflectionException' with message 'Class AdminCMSController does not exist' in E:\xampp\htdocs\laravel_admin\bootstrap \compiled.php:234
  • 不,我没有运行这个命令,你能告诉我这个命令,我该如何运行这个命令,还告诉我关于“/vendor/composer/autoload_classmap.php”我在那里搜索的内容

标签: php laravel laravel-4 laravel-routing


【解决方案1】:

如果您没有将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这一行

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

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

确保您可以在文件«project_root»/vendor/composer/autoload_classmap.php 中找到类AdminCMSController。您应该会看到如下内容:

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

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

  1. 使用PSR-0 自动加载类。假设您有以下文件夹结构:

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

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

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

如果你使用 PSR-0,你需要像这样命名你的类:

<?php namespace Acme\controllers;

class AdminCMSController extends BaseController {
(...)
}

对Acme 引用感到好奇?我也是。 Refer to the wikipedia.

【讨论】:

  • 感谢 milz 看到此解决方案后,我搜索了您在解决方案中提到的文件,并发现在 autoload_classmap.php 中定义了 $baseDir 。 '/app/controllers/AdminCms.php' 而不是 AdminCmsController 我认为这是问题所在,因此我必须更改此文件,在更改 autoload_classmap.php 中的文件名后,我将批准您的解决方案作为测试
  • 请注意,手动更改该文件不是一个好主意。该文件由作曲家自动创建。您必须执行composer dumpautoload,它应该会正确更新您的文件。
  • 是的,亲爱的朋友,我只是运行命令,如果你不介意我可以在这里问你更多的事情,或者你是否可以分享你的 gmail id 以便我可以和你交谈,那么这个文件就会更新
  • «project_root»/vendor/composer/autoload_classmap.php 为我工作。我必须说,一个非常常见的问题的非常详细的答案。谢谢
猜你喜欢
  • 2021-10-24
  • 2014-03-18
  • 2013-03-13
  • 2016-04-04
  • 2014-03-09
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多