3

我正在尝试构建我的 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"
}
4

1 回答 1

5
class HomeController extends \BaseController {

基本上因为你在一个命名空间中,你需要在全局命名空间中解析 BaseController (这就是它的\作用)。

你也可以侥幸逃脱

use \BaseController;

class HomeController extends BaseController {

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

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

尝试使用

namespace PageTypes\Home;

而不仅仅是PageTypes

于 2013-09-08T21:39:59.120 回答