Как сделать свой пакет для Laravel

Из этой статьи вы узнаете как можно быстро и просто создать свой пакет для фреймворка Laravel.

Шаг 1. Создание нового проекта

Я предпочитаю использовать установщик. Подробнее об установке вы можете прочитать здесь

laravel new lara-dg

Для тестирования и разработки пакетов я обычно использую SQLite. Настраиваем файл .env. В DB_DATABASE указываем путь к своей БД.

DB_CONNECTION=sqlite
DB_DATABASE=/Users/ivan/code/packages/test-project/database/database.sqlite

Создаем скелет нашего пакета. Будем использовать инструмент для командной строки. Он сгенерирует все необходимые файлы

composer require jeroen-g/laravel-packager

Затем запускаем команду генерации. Webkid это имя вендора (ваше пространство имен), а LaravelDiagnostic — название вашего проекта.

php artisan packager:new Webkid LaravelDiagnostic --i

Вводим информацию о вашем пакете и о вас. Это должно выглядеть примерно так

Теперь в директории вашего проекта есть папка пакета со всеми необходимыми файлами внутри.

Пакет автоматически загружается через composer. Я предпочитаю использовать относительные пути:

"repositories": {
    "webkid/laraveldiagnostic": {
        "type": "path",
        "url": "../../packages/lara-dg/packages/Webkid/LaravelDiagnostic"
    }
}

Также обновите секцию require, если она не была обновлена автоматически. Это создаст символическую ссылку в папке вендора на папку вашего пакета.

"require": {
    "webkid/laraveldiagnostic": "*"
},

Теперь, в папке src, вы можете создавать классы, но они должны иметь соответствующее пространство имен: Webkid\LaravelDiagnostic.

Например, у меня есть папка Commands и класс RunDiagnostic.php внутри. Соответственно, у него должно быть такое пространство имен:

namespace Webkid\LaravelDiagnostic\Commands;

Если вы хотите использовать свои миграции, маршруты, файлы конфигурации, шаблоны или ресурсы (js, CSS, изображения), то вам необходимо загрузить их в сервис-провайдере. Подробнее вы можете узнать об этом в официальной документации.  В этом примере я использую только команды. Посмотрите на метод bootForConsole() в LaravelDiagnosticServiceProvider:

public function bootForConsole()
{
    if ($this->app->runningInConsole()) {
        $this->commands([
            RunDiagnostic::class
        ]);
    }
}

Я впервые пытался структурировать свой пакет и хочу поделиться с вами своими личными предпочтениями.
Все PHP-классы я помещаю в папку src, а всё остальное — снаружи. Пример:

  • assets — CSS, JS, изображений;
  • config — файлы конфигурации;
  • migrations — миграции;
  • resources — шаблоны, языковые файлы и т. д.;
  • src — все PHP-классы, включая основного сервис-провайдера.

Если вам нужен еще какой-нибудь пакет, то необходимо отредактировать composer.json вашего пакета.

"require": {
    "cviebrock/eloquent-sluggable": "^4.3"
}

Еще один полезный совет. Когда вы работаете с ресурсами, и вам нужно одновременно тестировать изменения, то вы можете использовать символическую ссылку, чтобы избежать необходимости постоянной их публикации (vendor publish). Эта команда создаст символическую ссылку. Лично мне это сэкономило массу времени.

ln -s /path/to/your/project/webkid-cms/packages/webkid/cms/assets /path/to/your/project/webkid-cms/public/vendor/cms

Затем обновите автозагрузку композера, чтобы добавить новые файлы.

composer dump-autoload

Шаг 2. Размещение проекта на Github

Когда ваш код будет готов, переходите в папку пакета и инициализируйте репозиторий.

cd packages/Webkid/LaravelDiagnostic
git init
git add .
git commit -m "first commit"

Создайте новый репозиторий GitHub и добавьте источник.

git remote add origin git@github.com:yourusername/yourrepository.git
git push -u origin master
git tag -a 1.0.0 -m "release: First version"
git push --tags

Шаг 3. Размещение проекта на Packagist

Для начала зарегистрируйтесь на Packagist.org. Я использовал для регистрации свою Github-учетку.

Отправьте новый пакет, используя эту ссылку. Введите адрес своего пакета на GitHub и нажмите «Check» (Проверить). В случае возникновения ошибок, следуйте инструкциям на экране.

Когда закончите, то попадете на страницу вашего пакета, где, вероятно, получите подобное уведомление:

Этот пакет не обновляется автоматически. Пожалуйста, настройте GitHub Service Hook для Packagist, для обновления после каждого пуша!

Давайте это сделаем. Получите на этой странице токен API и перейдите на страницу вашего пакета в GitHub в раздел Settings > Webhooks & Services > Add a new service. Найдите Packagist. Введите имя пользователя, токен и нажмите «Submit». Ошибка в Packagist исчезнет через 5–10 минут.

Поздравляю, вы создали рабочий онлайн пакет. Теперь можно его запросить через композер.

Шаг 4. Продолжение работы над пакетом

Если приложение, в котором вы разработали пакет, имело эту единственную цель — помочь вам в разработке пакета, то всё готово.

Но если же вы делали свой пакет в более крупном проекте, где он вам всё еще нужен, то вы можете оставить код в папке пакетов и работать с ним там.

Всякий раз, когда вы заканчиваете работу, то можете удалить этот код из вашего composer.json

"repositories": {
    "webkid/laraveldiagnostic": {
        "type": "path",
        "url": "../../packages/lara-dg/packages/Webkid/LaravelDiagnostic"
    }
}

и вытянуть свой пакет с packagist.

Материалы

Автор: Ivan Kolodiy
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.