Класс верстака Laravel 4 не найден

16

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

  • 1
    Проблема на самом деле не в вашем классе, так как он не может найти Illuminate\Foundation\ProviderRespository . Помнишь ли ты composer update ?
  • 0
    Привет - обновленный пост выше. Я проверил, удалив запись поставщика услуг из массива поставщика услуг, и ошибка исчезла.
Показать ещё 1 комментарий
Теги:
laravel-4

3 ответа

45

Я обнаружил, что запущенная установка композитора из папки workbench/[vendor]/[package] решила проблему.

  • 0
    именно то, что мне нужно было сделать после создания нового рабочего места
  • 1
    Это должно быть в документации Laravel, это важный шаг, который пропущен в официальном введении в разработку пакетов .
Показать ещё 1 комментарий
20

Я столкнулся с той же ошибкой, поэтому я пошел глубже в поток, чтобы понять, что происходит.

Итак, в основном, в фазе начальной загрузки, когда загружается 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');
  • Me

    php artisan dump-autoload работает также, если вы удаляете службу из массива поставщиков

  • 0
    Благодарю. Ваш ответ помог мне больше всего с той же проблемой. Итак, короткий ответ: запустите dump-autoload ПЕРЕД добавлением сервиса в массив провайдеров. Это должно быть разъяснено в руководстве !
  • 1
    Создание нового пакета рабочей среды создает файл composer.json. Запуск "php artisan dump-autoload" не приводил к выводу ошибок, но мне не хватало информации об авторе, а автозагрузка не работала. После того как я ввел имя автора и адрес электронной почты, команда dump-autoload работала с автозагрузкой без необходимости запускать composer вручную из пакета vendor.
Показать ещё 1 комментарий
1

В дополнение к @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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню