Laravel 4无法从命名空间控制器中找到BaseController

Posted

技术标签:

【中文标题】Laravel 4无法从命名空间控制器中找到BaseController【英文标题】:Laravel 4 Can't find BaseController from namespaced controller 【发布时间】:2013-09-12 07:21:14 【问题描述】:

我正在尝试构建我的 Laravel 4 站点,以便 (1) 主要应用程序组的组件(控制器/视图/等)耦合在一起,以及 (2) Laravel 在我的 Web 服务器文档根目录之外的支持代码。默认的 laravel 主页加载正常,但我无法让命名空间控制器正确路由。这是相关的文件结构:

/ [Project Root]
     /laravel [full laravel install here]
          composer.json
          /app
               /controllers
                    BaseController.php
     /dev
          /htdocs
               index.php
               /app
                    /PageTypes
                         /Home
                              /controllers
                                   HomeController.php
                              /views
                                   HomeView.blade.php

默认的 laravel 登陆页面加载正常。但是,当我尝试使用自己的命名空间设置控制器时,我不断收到错误消息。

这是 HomeController.php

namespace PageTypes;

use Home\controllers;

class HomeController extends BaseController 

    public function showWelcome()
    
        return View::make('hello');
    


这里是 routes.php

<?php

Route::get('/', function()

    return View::make('hello');
);

Route::get('/home', 'PageTypes\Home\controllers\HomeController@showWelcome' );

此设置产生错误:“Symfony \ Component \ Debug \ Exception \ FatalErrorException Class 'PageTypes\BaseController' not found" 好的,laravel 至少找到了 HomeController.php。

大量其他 SO 响应告诉我尝试将 BaseController 更改为 \BaseController。进行这一更改并使其他所有内容保持不变会产生错误“ReflectionException:Class PageTypes\Home\controllers\HomeController 不存在”。什么?... >.

我不了解命名空间、psr-0 和 laravel 路由的交叉点,任何帮助将不胜感激。

后续问题:(1) 我可以采取哪些步骤来调试此问题?除了我在抛出的异常错误中看到的内容之外,nginx 的日志并没有真正告诉我任何事情。 (2) 有没有人在 github 上遇到过类似布局的 laravel 种子?我很想有一些东西可以参考。

这是我的配置设置:

// index.php 
...
require __DIR__.'/../../laravel/bootstrap/autoload.php';
$app = require_once __DIR__.'/../../laravel/bootstrap/start.php';
...

// bootstrap/autoload.php
...
require __DIR__.'/../vendor/autoload.php';
...


// bootstrap/paths.php
...
'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../dev/htdocs/',
'base' => __DIR__.'/..',
'storage' => __DIR__.'/../app/storage',
...

// compose.json

    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "require": 
        "laravel/framework": "4.0.*"
    ,
    "autoload": 
        "psr-0": 
            "PageTypes": "../dev/htdocs/app"
        ,
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ]
    ,
    "scripts": 
        "post-install-cmd": [
            "php artisan optimize"
        ],
        "pre-update-cmd": [
            "php artisan clear-compiled"
        ],
        "post-update-cmd": [
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ]
    ,
    "config": 
        "preferred-install": "dist"
    ,
    "minimum-stability": "dev"

【问题讨论】:

【参考方案1】:
class HomeController extends \BaseController 

基本上因为您在命名空间中,所以您需要解析 global namespace 中的 BaseController(这就是 \ 所做的)。

你也可以侥幸逃脱

use \BaseController;

class HomeController extends BaseController 

但由于您只会在整个控制器中引用 BaseController 一次,因此没有多大意义。

另一个潜在的问题是PageTypes\Home\controllers\HomeController 所指的命名空间。这实际上不是路径名,而是它正在寻找的命名空间名称(恰好遵循 PSR 的自动加载器将目录结构与命名空间匹配)。

尝试使用

namespace PageTypes\Home;

而不仅仅是PageTypes

【讨论】:

感谢您的见解,Hailwood,但运气不好。将控制器声明更改为class HomeController extends \BaseController 会产生错误“Class PageTypes\Home\controllers\HomeController 不存在”。添加 use 调用 (use \BaseController) 产生了相同的错误。我还尝试将我的命名空间声明更改为namespace PageTypes\Home,但仍然遇到同样的错误。 @swaysteady 你重新运行composer update了吗?能否请您发布您的vendor/composer/autoload_namespaces.php 的内容

以上是关于Laravel 4无法从命名空间控制器中找到BaseController的主要内容,如果未能解决你的问题,请参考以下文章

laravel入门教程

Laravel 5.7 使用某些命名空间的资源控制器路由名称是啥?

Laravel 4 目标接口不可实例化

在 Laravel 4 中使用命名空间

在命名空间中定义控制器仍然发生在 laravel 5.5 中的 Class App\Http\Controllers 错误

如何使用 phpunit 在 Laravel 4 中测试命名空间对象