在 Laravel 4 中访问包控制器
Posted
技术标签:
【中文标题】在 Laravel 4 中访问包控制器【英文标题】:Accessing package controllers in Laravel 4 【发布时间】:2013-02-03 14:14:46 【问题描述】:我在"Creating a Package" instructions in the Laravel 4 documentation 之后创建了一个包。创建包后,我创建了一个“控制器”文件夹和一个路由文件。新的文件结构是:
/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');
然后我跟随this 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
无论我尝试什么,包都无法访问它自己的控制器,composer 确认已加载(通过查看 vendor/package/autoload_classmap.php)。
有什么想法吗?我不确定问题是否是作曲家没有加载类,我不确定从哪里开始调试问题。我创建了另一个包并在这里重复了这些步骤并得到了同样的问题。
我可以从包和应用程序中访问包视图,例如:
View::make('package::view');
问题似乎在于 composer 加载控制器和 Laravel 能够访问它之间。
【问题讨论】:
【参考方案1】:看看这篇 git 文章可能会有所帮助 https://github.com/jaiwalker/setup-laravel4-package
【讨论】:
感谢“使用控制器”部分!将控制器添加到类映射解决了我的问题。 很高兴这对您有所帮助【参考方案2】:错误是在路由中包含控制器路径。我有以下内容:
Route::get('/package', 'Vendor\Package\Controllers\HomeController@showWelcome');
正确的用法是:
Route::get('/package', 'Vendor\Package\HomeController@showWelcome');
在控制器中包含命名空间:
namespace Vendor\Package;
控制器应该扩展照明:
\Illuminate\Routing\Controllers\Controller
仍然不能使用包名(例如:Package::HomeController@showWelcome),但我可以使用命名空间。耶。
问题解决了。
【讨论】:
我只是在玩 Laravel 4 并遇到了这个问题。您真的需要将每个类都添加到 vendor/composer/autoload_classmap.php 文件中吗?你会认为没有这个就可以找到这些类,不是吗? @neilcrookes 出于性能原因,composer 会生成所有类的平面类映射,此文件是自动生成的,除了快速测试之外,手动编辑它是一个非常糟糕的主意。它是使用 composer.json 文件中的信息生成的。见getcomposer.org/doc/04-schema.md#autoload【参考方案3】:您可以尝试编辑您的 Vendor/Package/composer.json 并将控制器目录插入到 autoload/classmap:
....
"autoload":
"classmap": [
"src/migrations",
"src/controllers",
"src/models"
],
"psr-0":
"Package\\Controller": "src/"
....
之后,打开您的终端并从您的包根目录执行 composer dump-autoload
为我工作...
【讨论】:
据我所知和经验,这不适用于供应商软件包,而仅适用于您工作台中的软件包。尝试删除供应商包中的 composer.json 文件并转储自动加载,这无关紧要,因为所有数据都是从 composer.lock 文件加载的。您可以编辑 autoload_classmap.php。如果您想知道幕后发生的事情,请查看 composer.lock 文件和 autoload_classmap.php 文件,它们可以很好地了解机制。如果我错了,请纠正我!以上是关于在 Laravel 4 中访问包控制器的主要内容,如果未能解决你的问题,请参考以下文章