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

时间:2013-09-08 18:59:36

标签: laravel laravel-4 psr-0

我正在尝试构建我的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 找不到类'PageTypes \ BaseController'“好吧,laravel至少找到HomeController.php。

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

我不了解名称空间,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 个答案:

答案 0 :(得分:5)

class HomeController extends \BaseController {

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

你也可以逃脱

use \BaseController;

class HomeController extends BaseController {

但是因为你只是在整个控制器中引用一次BaseController,所以没什么意义。

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

尝试使用

namespace PageTypes\Home;

而不只是PageTypes