Php 访问Laravel 4中的程序包控制器

Php 访问Laravel 4中的程序包控制器,php,laravel,laravel-4,Php,Laravel,Laravel 4,我已经创建了一个程序包。创建包之后,我创建了一个“controllers”文件夹和一个routes文件。新的文件结构是: /src /Vendor /Package PackageServiceProvider.php /config /controllers /lang /migrations /views routes.php /tests /public 我将路由文件添加到包服务提供程序的启动

我已经创建了一个程序包。创建包之后,我创建了一个“controllers”文件夹和一个routes文件。新的文件结构是:

/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”)工作:

然后,我开始为包设置控制器。我将src/controllers文件夹添加到composer类映射中,然后我转储了autoloader并检查了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',
);
但这会产生一个关于找不到类的错误:

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)

有什么想法吗?我不确定问题是否是composer没有加载该类,我不确定从何处开始调试该问题。我已经创建了另一个包,并重复了这里的步骤,得到了相同的问题

我可以从软件包和应用程序访问软件包视图,例如:

View::make('package::view');

问题似乎出现在composer加载控制器和Laravel能够访问控制器之间。

错误在于在路由中包含控制器路径。我有以下几点:

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),但我可以使用名称空间。耶


问题已解决。

您可以尝试编辑供应商/Package/composer.json并将控制器目录插入自动加载/classmap:

....
"autoload": {
    "classmap": [
        "src/migrations",
        "src/controllers",
        "src/models"
    ],
    "psr-0": {
        "Package\\Controller": "src/"
    }
}
....
之后,打开终端,从软件包根目录执行一个composer dump autoload


适合我…

看看这篇git文章可能会有所帮助

我刚刚在玩拉威尔4,遇到了这个问题。您真的需要将每个类添加到vendor/composer/autoload_classmap.php文件中吗?你会认为如果没有这个,它可以找到这些类,不是吗?@neilcrookes出于性能原因,composer生成了所有类的平面类映射,这个文件是自动生成的,除了快速测试之外,手动编辑它是一个非常糟糕的主意。它是使用composer.json文件中的信息生成的。请参阅,据我所知和经验,这将不适用于供应商软件包,而仅适用于工作台中的软件包。尝试删除供应商包中的composer.json文件并转储autoload,这无关紧要,因为所有数据都是从composer.lock文件加载的。您可以编辑自动加载的_classmap.php。如果您想知道幕后发生了什么,请查看composer.lock文件和autoload_classmap.php文件,它们可以很好地洞察机制。如果我错了,请纠正我!感谢“使用控制器”部分!将控制器添加到类映射解决了我的问题。我很高兴这对您有所帮助
\Illuminate\Routing\Controllers\Controller
....
"autoload": {
    "classmap": [
        "src/migrations",
        "src/controllers",
        "src/models"
    ],
    "psr-0": {
        "Package\\Controller": "src/"
    }
}
....