Сегодня поговорим о том, как начать создавать пакет для Laravel и регистрировать свой сервис провайдер.
На сайте Laravel отличная документация о том как разрабатывать собственные пакеты и как работает сервис провайдер. А мы помимо этого также рассмотрим как их публиковать и как выстраивать процесс разработки.
Такой вопрос, я думаю, более ярко волнует любопытных новичков. Процесс разработки собственного решения крайне полезен в обучении, так как в процессе вы столкнетесь с множеством проблем и будете вынуждены соблюдать принципы solid. Так как ваш проект могут использовать другие пользователи и он будет использоваться повторно.
Посмотрите на папку vendor
Первое, на что стоит обратить внимание при разработке собственного пакета (особенно, если делаете это впервые), так это на структуру других пакетов. Все пакеты находятся в папке vendor и имеют плюс-минус идентичную структуру.
Для того, чтобы не отходить от стандартов Laravel, предлагаю изучить структуру файлов у пакетов, которые предоставляет сам Laravel. Они находятся по адресу vendor/laravel/packageName.
Первый шаг
Далее, мы сделаем первый шаг к созданию нашего простого пакета. Создадим директорию, для хранения файлов нашего пакета. Назовем директорию packages (наименование может быть любым). Эта директория будет аналогична по смыслу директории vendor. Далее, создается директория с vendorName, эта директория в основном имеет имя автора пакета, допустим она будет называть packages/bvv. И уже в ней мы создаем папу с нашим пакетом.
Второй шаг
Теперь, мы должны перейти в терминале в созданную директорию и инициализировать git репозиторий. Это не стоит игнорировать, так как в дальнейшем гит понадобится нам для публикации своего пакета.
Также, создадим в нашей директории пакеты файла .gitignore. В процессе разработки пакета Вам необходимо добавить в .gitignore директорию vendor. После, когда пакет будет инициализирован в приложении с помощью composer, все зависимости уже установятся в вашу директорию vendor проекта.
Создадим файл README.md для того, чтобы добавить описания нашему пакету.
Одним из основных файлов любого пакета является composer.json. В нем мы описываем все зависимости нашего пакета и базовую информацию о нем.
Ниже пример composer.json одного из моих пакетов
Прошу обратить внимание на блок extra в приведенном выше примере. При установке различных пакетов для laravel в инструкциях по использованию мы часто видим требование указать информацию о сервис-провайдере в файле app.php вашего приложения. Так вот при использовании блока extra в composer.json такая надобность пропадает.
При инициализации пакета через composer все провайдеры и фасады указанные в данном блоке будут автоматически опубликованы. Более подробно можете почитать в самом начале раздела о разработке пакетов в документации Laravel.
В папке с нашим пакетом создаем директорию /src (название может быть любым, но это общепринятое). Эта папка будет схожа по структуре на папку app/ нашего проекта Laravel. Вы также сможете создавать в ней директории с контроллерами, моделями и тд.
Начнем мы с сервис-провайдера и создадим директорию Providers/, а в ней наш провайдер - PackageServiceProvider. Вы можете воспользоваться командой:
php artisan make:provider PackageServiceProvider
и перенести созданный провайдер в соответствующую директорию нашего пакета.
Сервис-провайдер это то, с чего всегда начинается разработка пакета для Laravel, ведь именно он является связующим звеном между пакетом и нашим приложением. Также, не забудьте указать namespace для нашего провайдера и в дальнейшем для любых других классов. Все namespace'ы должны начинаться одинаково VendorName/PackageName/... В случае с приведенным примером composer .json все классы пакеты Moysklad должны начинаться с namespace'а Bvv/Moysklad
После создания провайдера, нам необходимо подключить его в нашем приложении. Переходим в конфиг-файл config/app.php находим здесь раздел providers и в самом конце указываем класс нашего сервис-провайдера.
Если вы начинаете делать пакет и тестируете его работу в своем приложении, вы можете зарегистрировать пакет в composer.json вашего приложения и не опубликовывать его на packagist, а сразу использовать локально.
Для этого переходим в composer.json нашего приложения и добавляем информацию о пакете в блок autoload, по аналогии с примером ниже.
После изменения файла необходимо выполнить команду:
compose dump-autoload
После проделанных манипуляций, мы можем продолжать разработку нашего пакета, как разработку любого приложения на Laravel.
При создании файлов конфигураций, миграций, представлений, маршрутов, и т.п. вы можете добавить в свой сервис-провайдер пакета функции-публикации и функции-регистраторы, которые буду опубликовывать и регистрировать файлы пакета в приложении.
Обычно, вам нужно опубликовать конфигурационный файл вашего пакета в каталог config приложения. Это позволит пользователям вашего пакета легко переопределить параметры конфигурации по умолчанию. Чтобы разрешить публикацию ваших файлов конфигурации, вызовите метод publishes в методе boot вашего поставщика службы:
Теперь, когда пользователи вашего пакета выполнят команду php artisan vendor:publish, ваш файл будет скопирован в указанное место публикации. После публикации вашей конфигурации, к ее значениям можно будет получить доступ, как к любому другому файлу конфигурации.
Более подробно о регистрации и публикации элементов вашего пакета советую почитать в документации.
Также, готов ответить на ваши вопросы в телеграмме:
- Личка - https://t.me/BovgiraV
- Канал, где делюсь своими мыслями, интересными статьями, отвечаю на вопросы - https://t.me/bovgira