Laravel 4中找不到控制器类

Dee*_*yal 0 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');
Run Code Online (Sandbox Code Playgroud)

这是我的控制器中的代码

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

    public function createpage() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Luí*_*ruz 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',
    ));
    (...)
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    确保你有线 app/controllers

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

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

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

'AdminCMSController' => $baseDir . '/app/controllers/AdminCMSController.php',
Run Code Online (Sandbox Code Playgroud)

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

  1. 使用PSR-0进行自动加载类.想象一下,您有以下文件夹结构:

    /app
        /commands
        /config
        /database
        /Acme
            /controllers
    
    Run Code Online (Sandbox Code Playgroud)

    你必须指定你的Acme文件夹composer.json,如下所示:

    "autoload": {
        "classmap": [
            "app/commands",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ],
        "psr-0": {
            "Acme": "app/"
        }
    },
    
    Run Code Online (Sandbox Code Playgroud)

    在此之后,您需要使用该命令更新composer autoload文件composer dumpautoload.

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

    Route::controller('cms','AdminCMSController');
    
    Run Code Online (Sandbox Code Playgroud)

    对此:

    Route::controller('cms','Acme\controllers\AdminCMSController');
    
    Run Code Online (Sandbox Code Playgroud)

如果你使用PSR-0,你需要命名你的类,如下所示:

<?php namespace Acme\controllers;

class AdminCMSController extends BaseController {
(...)
}
Run Code Online (Sandbox Code Playgroud)

好奇Acme参考?我也是.请参阅维基百科.