【问题标题】: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 一样试试吗?因此,您无需担心命名空间。它会自动生成。

标签: php laravel laravel-5 laravel-routing


【解决方案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 文件夹的根目录下。

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 2021-03-29
        • 2020-04-13
        • 2016-03-13
        • 1970-01-01
        • 2015-07-21
        • 2018-01-03
        • 1970-01-01
        • 2022-01-11
        相关资源
        最近更新 更多