在 Laravel 5.1 中获得 "Class 'app\Http\Controllers\Controller' not found"

Getting "Class 'app\Http\Controllers\Controller' not found" in Laravel 5.1

我是 Laravel 的新手,在学习教程时遇到此错误。这是我在 'testController.php'.

中的代码
<?php

namespace app\Http\Controllers;

use app\Http\Controllers\Controller;

class testController extends \app\Http\Controllers\Controller {

public function getAbout()
{
    return view('Learning.about') ;
}

public function getHome()
{
    return view('Learning.index');
}

}

这是我的'routes.php'。

<?php
Route::get('test', [
   'as' => 'test', 
   'uses' => 'testController@getHome',
]);

Route::get('about', [
    'as' => 'about', 
    'uses' => 'testController@getAbout',
]);

我收到这个错误:

Class 'app\Http\Controllers\Controller' not found

我该如何解决这个错误?

使用正确的命名空间:

namespace App\Http\Controllers;

// Remove: use app\Http\Controllers\Controller;

class testController extends Controller {

根据我在Laravel项目中的经验,命名空间以App的大写A开头,在命名空间中使用,您应该尝试将代码更改为:

namespace App\Http\Controllers;

class testController extends Controller { }

还要检查控制器 - App\Http\Controllers\Controller 是否与代码中提到的名称空间相同。

让我们一步一步来。

1。检查 composer.json

上的自动加载指令

打开项目根目录中的 composer.json 文件。找到 autoload 部分。它应该看起来像这样:

{
    ...
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\": "app/"
        }
    },
}

确保在 psr-4 选项下有此配置:

"App\": "app/"

此配置告诉作曲家我们要使用 psr-4 约定自动加载 app 目录中的所有 classes 并将其放置在 App 命名空间下。

2。更新您的控制器

首先,您的控制器文件名应采用 CamelCase 样式。所以我们不得不将它重命名为TestController.php。确保它保存在 app/Http/Controllers 目录下。

现在打开您的 TestController.php 文件,我们必须将命名空间和 class 名称大写,如下所示:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class TestController extends Controller {
    public function getAbout()
    {
        return view('Learning.about') ;
    }

    public function getHome()
    {
        return view('Learning.index');
    }
}

注意我们也转这一行:

class testController extends \app\Http\Controllers\Controller

进入:

class TestController extends Controller

因为我们已经导入了基础 Controller class,所以我们不必指定完全限定名称。我们使用 use 关键字导入 Controller class:

use App\Http\Controllers\Controller;

保存您的 TestController.php 文件。

3。更新您的路线文件

现在我们必须更新 app\Http\routes.php 文件。我们只需要将控制器名称大写:

<?php

Route::get('test', ['uses' => 'TestController@getHome', 'as' => 'test']);

Route::get('about', ['uses' => 'TestController@getAbout', 'as' => 'about']);

4 更新自动加载器

现在是最后一件事。打开您的终端/命令提示符。转到您的项目目录并运行以下命令:

composer dump-autoload

此命令将更新自动加载器文件 (Read more here)。

现在,如果您打开浏览器并点击 /test 路由,您应该会看到来自 resources/views/Learning/index.blade 的内容。

将其包含在您的 Controller 文件的顶部。这为我修好了。

namespace App\Http\Controllers;

在某些情况下,问题是框架无法实例化给定的控制器 class。例如,如果您正在使用 Controllers 下的子文件夹,并且当您扩展 Controller.php class 时,您没有提供 use 声明,就会发生这种情况定义*。其他 运行 次错误也可能导致此问题。

*现在需要,因为您自己的控制器不再位于 Controller 文件夹的根目录中。