Я пытаюсь разработать пакет в laravel 4 - свою первую попытку в пакете. Я нашел пару обучающих программ, которые я попытался выполнить:
http://jasonlewis.me/article/laravel-4-develop-packages-using-the-workbench
и
http://culttt.com/2013/06/24/creating-a-laravel-4-package/
и, конечно, в официальной документации.
Я следил за базовой структурой для создания фреймворка. Однако при загрузке приложения я получаю ошибку класса, не найденную. Это напрямую относится к serviceprovider, который я разместил в файле 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();
}
}
Я дважды проверял орфографию и запускал компоновщик dump-autoload как из корня проекта, так и из корня пакета.
У меня закончились идеи для решения класса, которые не нашли никаких идей, в которых я ошибся?
Линия, создающая ошибку, такова:
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)
$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
в корне проекта composer.json
.
Благодаря @biscii обратите внимание, что следует использовать:
"illuminate/support": "4.1.x"
вместо
"illuminate/support": "4.x"
Illuminate\Foundation\ProviderRespository
. Помнишь ли тыcomposer update
?