Доступ к контроллерам пакетов в Laravel 4

Я создал пакет в соответствии с инструкциями «Создание пакета» в документации 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 

Независимо от того, что я пытаюсь сделать, пакет не может получить доступ к своему собственному контроллеру, который подтверждает композитор (просмотрев поставщика / пакет / autoload_classmap.php).

Есть идеи? Я не уверен, что проблема заключается в том, что композитор не загружает класс, я не уверен, с чего начать с отладки проблемы. Я создал другой пакет и повторил шаги здесь и получил ту же проблему.

Я могу получить доступ к представлениям пакетов как из пакета, так и из приложения, например:

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

Кажется, что проблема заключается в том, что композитор загружает контроллер, и 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), но я могу использовать пространство имен. ура.

Задача решена.

Вы можете попробовать изменить свой поставщик / пакет / composer.json и вставить директорию контроллеров в autoload / classmap:

 .... "autoload": { "classmap": [ "src/migrations", "src/controllers", "src/models" ], "psr-0": { "Package\\Controller": "src/" } } .... 

После этого откройте свой терминал и из корневого каталога вашего дистрибутива создайте автозагрузку композитора

Работает на меня…

взгляните на эту статью git, возможно, поможет https://github.com/jaiwalker/setup-laravel4-package