我按照 Laravel 4 文档中的“创建包”说明创建了一个包。创建包后,我创建了一个“控制器”文件夹和一个路由文件。新的文件结构是:
/src
/Vendor
/Package
PackageServiceProvider.php
/config
/controllers
/lang
/migrations
/views
routes.php
/tests
/public
我将路由文件添加到包服务提供商的引导部分:
public function boot()
{
$this->package('vendor/package');
include __DIR__ . '/../../routes.php';
}
然后在路由文件中添加一个基本路由:
Route::get('/package', function() {
return "Package route test";
});
在指定路径 (app.dev/package) 访问我的应用程序会返回预期的结果:
Package route test
然后向路由添加一个基本的控制器调用(使用默认的 Laravel 控制器,“HomeController”)就可以了:
Route::get('/package', 'HomeController@showWelcome');
然后我按照这个 SO answer为包设置控制器。我将 src/controllers 文件夹添加到 Composer 类映射中,然后我转储了自动加载器并检查了 vendor/composer/autoload_classmap.php 并发现该类已被 Composer 成功加载:
<?php
// autoload_classmap.php generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'HomeController' => $baseDir . '/src/controllers/HomeController.php',
);
现在我使用命名空间将新的包控制器添加到路由中:
Route::get('/package', 'Vendor\Package\Controllers\HomeController@showWelcome');
但这会产生一个关于找不到类的错误:
ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist
我也尝试过使用包名来调用它:
Route::get('/package', 'Package::HomeController@showWelcome');
这会产生相同的错误:
ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist
无论我尝试什么,包都无法访问它自己的控制器,作曲家确认已加载(通过查看 vendor/package/autoload_classmap.php)。
有任何想法吗?我不确定问题是否是作曲家没有加载类,我不确定从哪里开始调试问题。我创建了另一个包并在这里重复了这些步骤并得到了同样的问题。
我可以从包和应用程序访问包视图,例如:
View::make('package::view');
问题似乎在作曲家加载控制器和 Laravel 能够访问它之间。