Я создал пакет, следуя инструкциям «Создание пакета» в документации 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-ответ для настройки контроллера для пакета. Я добавил папку src / controllers в карту классов композитора, затем сбросил автозагрузчик и проверил vendor / composer / autoload_classmap.php и обнаружил, что класс успешно загружен композитором:
<?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 получить к нему доступ.