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