Я пытаюсь разработать пакет в laravel 4 – свою первую попытку в пакете. Я нашел пару учебников, которые я попытался выполнить:
http://jasonlewis.me/article/laravel-4-develop-packages-using-the-workbench
а также
http://culttt.com/2013/06/24/creating-a-laravel-4-package/
и, конечно же, в официальной документации.
Я следил за базовой структурой, чтобы создать фреймворк. Однако при загрузке приложения я получаю ошибку класса, не найденную. Это напрямую относится к сервису, который я разместил в файле app.php.
вот моя запись в массиве провайдеров:
'Longestdrive\Calendar\CalendarServiceProvider'
Моя структура папок:
laravel/workbench/longestdrive/calendar/src/Longestdrive/Calendar
У моего поставщика услуг есть следующие данные:
<?php namespace Longestdrive\Calendar; use Illuminate\Support\ServiceProvider; class CalendarServiceProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = false; /** * Bootstrap the application events. * * @return void */ public function boot() { $this->package('longestdrive/calendar'); } /** * Register the service provider. * * @return void */ public function register() { // } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array(); } }
Я дважды проверял орфографию и запускал автозагрузку компоновщика как из корня проекта, так и из корня пакета.
У меня не хватало идей для решения класса, не нашли идей, в которых я ошибся?
Линия, создающая ошибку, такова:
C:\wamp\www\googleapi\laravel\vendor\laravel\framework\src\Illuminate\Foundation\ProviderRepository.php
Любая помощь оценивается
благодаря
Обновление: я выполнил обновление для композитора, как это было предложено в папке workbench / package с ответом, которое ничего не обновляет. Затем я запустил композитор в корне проекта и возникла ошибка:
[RuntimeException] Error Output: PHP Fatal error: Class 'Longestdrive\Calendar\CalendarServiceProvider' not found in C:\wamp\www\googleapi\laravel\vendor\laravel\framework\src\Illuminate\Foundation\ProviderRe pository.php on line 123
Вероятно, я опубликовал неверную строку ошибки раньше. Полный ответ на исключение:
Class 'Longestdrive\Calendar\CalendarServiceProvider' not found
Экстракт ошибки:
* @param \Illuminate\Foundation\Application $app * @param string $provider * @return \Illuminate\Support\ServiceProvider */ public function createProvider(Application $app, $provider) { return new $provider($app); }
который, как я полагаю, относится к загрузчику поставщика услуг, не находящего CalendarServiceProvider?
Я обнаружил, что запущенная установка композитора из папки workbench / [vendor] / [package] решила проблему.
Я столкнулся с той же ошибкой, поэтому я пошел глубже в поток, чтобы понять, что происходит.
Таким образом, немного анализируя в основном, на этапе начальной загрузки, когда bootstrap/autoload.php
он запускается в конце:
if (is_dir($workbench = __DIR__.'/../workbench')) { Illuminate\Workbench\Starter::start($workbench); }
Для этого требуется КАЖДЫЙ workbench/vendor/package/**/**/**/autoload.php
он нашел (используя Symfony Finder Component)
$finder->in($path)->files()->name('autoload.php')->depth('<= 3');
workbench/vendor/package/vendor/autoload.php
. Последовательно в bootstrap/start.php
он получает «поставщиков», определенных в config/app.php
и пытается загрузить каждый из них:
$providers = $config['providers']; $app->getProviderRepository()->load($app, $providers);
а затем в ProviderRepository.php
foreach ($providers as $provider) { $instance = $this->createProvider($app, $provider);
поэтому мы получим:
public function createProvider(Application $app, $provider) { return new $provider($app);
где он пытался создать экземпляр класса, на самом деле не загружен автоматически. И вот почему исключение забросило!
Как сказал @Ray, удалив свою службу из 'providers' => array(
не возникает ошибка, return new $myServiceDeclaredInProviderArray($app);
никогда не срабатывает для этой службы.
Как сказал @ Andrew Holt
Я обнаружил, что запущенная установка композитора из папки workbench / [vendor] / [package] решила проблему.
Он абсолютно прав, потому что это создает каталог и файлы autoload vendor, и все работает так, как мы ожидаем, потому что оно находит файлы автозагрузки:
$finder->in($path)->files()->name('autoload.php')->depth('<= 3');
php artisan dump-autoload
работает, если вы удалите службу из массива поставщиков
В дополнение к ответам @ilpaijin и @Andrew Holt иногда возникает необходимость (когда есть новая версия Laravel) для запуска composer update
в папке workbench/vendor/package
.
Кроме того, как отмечено здесь , composer.json
в пакете должен требовать ту же версию illuminate/support
что и требуемый для laravel/framework
в laravel/framework
root проекта.
Благодаря @biscii обратите внимание, что следует использовать:
"illuminate/support": "4.1.x"
вместо
"illuminate/support": "4.x"