【问题标题】:Laravel namespaces class not found未找到 Laravel 命名空间类
【发布时间】:2015-03-06 16:27:05
【问题描述】:

我是 Laravel 命名空间的新手。

我正在尝试做这样的事情:

namespace App\Controllers; // when I remove this line, everything works fine... I need to include this

class HomeController extends BaseController {

    protected $layout = "layouts.main";

    public function __construct() {
        // some stuff here
    }

    /**
     * Home page.
     * @return View
     */
    public function getHome() {
        // Show the page
        $this->layout->content = View::make('home');
    }
}

但是我遇到了这个奇怪的错误,

Class HomeController does not exist 

这是我的一些 composer.json 的东西,

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/libraries",            
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
    ]
}, 

我也执行了,

composer dump-autoload

虽然我正在路由这样的东西,

# Default
Route::get('/', array('as' => 'home', 'uses' => 'HomeController@getHome'));

【问题讨论】:

    标签: php laravel-4 namespaces


    【解决方案1】:

    这是可能发生此错误的一种常见情况:

    假设您正在使用该类定义路线:

    Route::get('/home', 'HomeController@getIndex');
    

    Laravel 核心会将字符串 ('HomeController@getIndex') 传递给路由类内部深处的一些方法,解析它,实例化 HomeController,然后调用 getIndex。该代码是否包含use App\Controllers 指令?不太可能,因为这是您创建的。基本上,无论在哪里使用 HomeController 类(我不知道它在哪里),PHP 解释器都不会知道该类的来源。

    解决方案是使用完全限定类名。这意味着在字符串中包含完整的命名空间,如下所示:

    Route::get('/home', '\App\Controller\HomeController@getIndex');
    

    现在,当 Laravel 尝试实例化该类时,它拥有找到它所需的一切。

    我不确定这是否是问题所在 - 您需要向我们展示发生错误的代码 - 但这是一种可能性。

    【讨论】:

    • 对不起,如果我不能很好地解释,我不知道路由器可能是真正的原因,我已经实施了你的解决方案,它就像魅力一样。 @Kryten +1 努力。非常感谢。
    • 我已经更新了我的问题,我错过了向您展示的路线。
    【解决方案2】:

    您是否在尝试使用它的文件中输入use App\Controllers\HomeController?这基本上包括它。

    【讨论】:

    • 不是的,我之前没用过,但是用了之后还是一样的错误,出现了一条黄线说未使用的Use语句。
    【解决方案3】:

    您不会在 app/controllers 中为控制器使用命名空间。 HomeController 扩展了 BaseController,后者扩展了框架中的 Controller。

    如果您将自定义库包含到框架中,您可能希望使用命名空间。 /app/libraries 例如。

    只要你的 routes.php 有一些 url 可以访问 home 控制器方法,它应该可以工作。

    Route::get('/home', 'HomeController@index');
    

    HomeController.php:

    class HomeController extends BaseController {
    
        private $myVar;
    
        public function __construct() {
            // some stuff here
        }
    
        public function index(){
            return View::make('home');
        }
    }
    

    【讨论】:

    • 感谢@shazbot,其他一切都在工作,我的路由正确并且它工作得很好,但不幸的是,我只需要使用带有命名空间的控制器。 stackoverflow.com/questions/14714848/…
    • 没有什么能阻止你为控制器使用命名空间——我在我正在处理的一个大型项目中非常成功地做到了这一点。关键是确保对命名空间类的所有引用都是正确的 - 在使用该类的文件中使用 use 指令,或者,如果您在路由示例中使用字符串中的类名,则使用完全限定的类名。
    猜你喜欢
    • 2014-04-05
    • 2021-12-31
    • 2015-04-13
    • 1970-01-01
    • 2019-03-03
    • 2016-05-03
    • 2015-09-23
    相关资源
    最近更新 更多