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