在 Laravel 5.1 中获取“找不到类 'app\Http\Controllers\Controller'”

Posted

技术标签:

【中文标题】在 Laravel 5.1 中获取“找不到类 \'app\\Http\\Controllers\\Controller\'”【英文标题】:Getting "Class 'app\Http\Controllers\Controller' not found" in Laravel 5.1在 Laravel 5.1 中获取“找不到类 'app\Http\Controllers\Controller'” 【发布时间】:2017-03-27 08:33:34 【问题描述】:

我对 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',
]);

我收到此错误:

找不到类'app\Http\Controllers\Controller'

我该如何解决这个错误?

【问题讨论】:

你是通过 php artisan 生成还是手动创建的?你能像 php artisan make:controller TestController 一样试试吗?因此,您无需担心命名空间。它会自动生成。 【参考方案1】:

让我们一步一步来。

1。检查 composer.json 上的自动加载指令

在您的项目根目录中打开composer.json 文件。找到autoload 部分。它应该是这样的:


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

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

"App\\": "app/"

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

2。更新您的控制器

首先,您的控制器文件名应该是驼峰式格式。所以我们必须将其重命名为TestController.php。确保它保存在app/Http/Controllers 目录下。

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

<?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 类,我们不必指定完全限定名称。我们使用 use 关键字导入了 Controller 类:

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 的内容。

【讨论】:

【参考方案2】:

使用正确的命名空间:

namespace App\Http\Controllers;

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

class testController extends Controller 

【讨论】:

你的控制器在app\Http\Controllers,对吧? 是的,它在控制器中,与“testController”相同。 您删除了use app\Http\Controllers\Controller; 行吗? 是的,我做了,但没有任何区别。顺便说一句,我刚刚注意到我的 Controller.php 具有路径“App\Http\Controllers\Auth\Controller.php”。这里对代码有影响吗? 如果您仍然收到app\.. 消息,那么您没有删除该行或没有更改命名空间或extends 部分。上面的代码来自标准 Laravel 控制器。仔细检查一切。【参考方案3】:

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

namespace App\Http\Controllers;

class testController extends Controller  

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

【讨论】:

实际上 Controller.php 位于 'App\Http\Controllers\Auth\Controller.php'。我认为这对命名空间没有任何影响,是吗? 我认为字母的大小写根据不同的操作系统而有所不同,例如在 mac 中它反应正确,而在 Ubuntu 中它反应错误,等等其他操作系统也是如此【参考方案4】:

将它包含在控制器文件的顶部。这为我解决了问题。

namespace App\Http\Controllers;

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于在 Laravel 5.1 中获取“找不到类 'app\Http\Controllers\Controller'”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 5.1 中获取前一周的数据?

如何在 Laravel 5.1 中获取数据库中的表列表

如何使用 Laravel 5.1 在 IronMQ 中获取排队作业的数量?

在 Laravel 5.1 中获取“找不到类 'app\Http\Controllers\Controller'”

在 Laravel 5.1 中传递数据控制器以查看获取未定义的变量

Laravel 5.1 Ajax 从 Blade View 获取 html