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 5.7 使用某些命名空间的资源控制器路由名称是啥?
在命名空间中定义控制器仍然发生在 laravel 5.5 中的 Class App\Http\Controllers 错误