Класс Workbench класса Laravel 4 не найден

Я пытаюсь разработать пакет в 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"