Создание пакета для Laravel
Доброго времени суток. В одной из статей «Реализация модульной структуры в Laravel» мы с вами реализовали модульную систему в Laravel. А в данной статье давайте весь наш код оформим в пакет для Laravel. Затем опубликуем пакет на github и зарегистрируем на packagist. После этого мы сможем с помощью composer устанавливать наш пакет в любом проекте Laravel.
У нас есть реализованный функционал, который позволяет нам использовать модульную структуру в Laravel. Напомню. В папке app есть папка Modules, где находится сервис-провайдер ModulesServiceProvider.php, а также папки с модулями. Также в папке с конфигурационными файлами находится файл конфигурации module.php, где хранятся подключаемые модули и их настройки. Ок. Давайте весь этот функционал перенесем в пакет.
Создаем репазиторий Composer
Давайте создадим локальный репазиторий composer (пока локальный). В корне нашего проекта создадим папку packages, в которой создадим папку zloykolobok (это будет имя вендора), и уже в папке zloykolobok создадим папку нашего пакета modules.
Теперь в консоли переходим в папку packages/zloykolobok/modules. И инициализируем репазиторий composer
composer init
Дальше нам необходимо ввести:
- Название пакета, в формате <вендор>/<название>
- Описание пакета
- Автор, в формате John Smith john@example.com
- Minimum Stability указываем dev
- Package Type оставляем пустым
- License []: ставим MIT
- Затем определяем зависимости, у нас их нет, поэтому ставим no
- Подтверждаем
Отлично, у нас появился composer.json
Открываем на редактирование composer.json. И первое, что нам необходимо сделать это добавить версию:
… "version": "1.0.0", …
Второе добавляем автозагрузку:
… "autoload": { "psr-4": { "Zloykolobok\\Modules\\": "" } …
Отлично мы с вами создали локальный репазиторий composer. Да, он у нас пока пустой. Дальше мы и будем его наполнять. А сейчас давайте проверим. Установим его в наш проект.
Установка локального репазитория Composer
Для того, чтобы установить пакет из локального репазитория нам необходимо указать composer откуда устанавливать. Для этого открываем на редактирование composer.json, который находится в корне нашего проекта.
Обратите внимание не в папке packages/zloykolobok/modules, а именно в корне проекта. В моем случае это e:\OpenServer\domains\module.loc
И добавляем:
… "repositories": [ { "type": "path", "url": "packages/zloykolobok/modules/" } ], …
Теперь включаем пакет в список зависимостей «zloykolobok/modules»: «*» И обновляем composer. Для этого переходим в корень нашего проекта и запускаем команду:
composer update
Отлично пакет установлен.
И если, мы перейдем в vendor, то у нас есть папка zloykolobok, а в ней ссылка на modules (ссылка, т.к. у нас данный пакет расположен локально)
Теперь приступим к наполнению нашего пакета.
Создание пакета для Laravel
Первое перенесем сервис-провайдер ModulesServiceProvider.php в наш пакет packages/zloykolobok/modules
И откроем его на редактирование.
Меняем namespace на Zloykolobok\Modules
Добавим переменную
… $dir = app_path().'/Modules'; …
и заменим __DIR__ на $dir.
Зарегистрируем конфигурацию
… $this->mergeConfigFrom(__DIR__ . '/config/module.php', 'module'); …
указываем откуда и куда.
И делаем нашу конфигурацию для модуля публикуемой, добавляем:
… $this->publishes([ __DIR__.'/config' => base_path('config'), ]); …
Вот в принципе и все. Листинг нашего сервис-провайдера:
<?php namespace Zloykolobok\Modules; /** * Сервис провайдер для подключения модулей */ class ModulesServiceProvider extends \Illuminate\Support\ServiceProvider { public function boot() { //регистрируем конфиг $this->mergeConfigFrom(__DIR__ . '/config/module.php', 'module'); $this->publishes([ __DIR__.'/config' => base_path('config'), ]); $modules = config("module.modules"); $dir = app_path().'/Modules'; // dd($dir); if($modules) { while (list(,$module) = each($modules)){ // dd(file_exists($dir.'/'.$module.'/Routes/routes.php')); //Подключаем роуты для модуля if(file_exists($dir.'/'.$module.'/Routes/routes.php')) { $this->loadRoutesFrom($dir.'/'.$module.'/Routes/routes.php'); } //Загружаем View //view('test::admin') if(is_dir($dir.'/'.$module.'/Views')) { $this->loadViewsFrom($dir.'/'.$module.'/Views', $module); } //Подгружаем миграции if(is_dir($dir.'/'.$module.'/Migration')) { $this->loadMigrationsFrom($dir.'/'.$module.'/Migration'); } //Подгружаем переводы //trans('test::messages.welcome') if(is_dir($dir.'/'.$module.'/Lang')) { $this->loadTranslationsFrom($dir.'/'.$module.'/Lang', $module); } } } } public function register() { } }
Все файлы вы можете найти на github
Теперь осталось только подключить этот сервис-провайдер к Laravel. Для этого открываем на редактирование файл config/app.php
И в разделе «Providers» добавляем
… Zloykolobok\Modules\ModulesServiceProvider::class, …
Все. Теперь наш пакет необходимо выложить на github.
Создание репазитория на github.
Переходим на github и создаем новый репазиторий. Описывать как создать репазиторий на github я не буду (там ничего сложного нет, да и информации по этому вопросу в интернет куча). Пустой репазиторий мы создали, теперь наш пакет необходимо запушить.
Переходим в консоли в корень нашего пакета (в моем случае packages/zloykolobok/modules) и выполняем команду, для создание git репазитория
git init
Дальше добавляем наши файлы под версионный контроль выполняем:
git add *
Теперь необходимо закомитеть наши файлы:
git commit -m "Modular system in Laravel"
Следующим шагом подключаем удаленный репазиторий на github
git remote add origin git@github.com:zloykolobok/modules.git
Учтите, что адрес у вас будет другой
Все репазиторий подключен. Теперь мы можем запушить (выложить) наш репазиторий на github:
git push -u origin master
Все наш пакет на гите.
Супер. Теперь нам необходимо зарегистрировать наш проект на packagist.org, чтобы composer знал о нашем пакете.
Регистрация пакета на packagist
Переходим packagist.org и входим в наш аккаунт. Жмем «Submit» и добавляем ссылку на git-репазиторий
Жмем «Check». Еще раз подтверждаем и все наш пакет зарегистрирован на packagist.
Отлично теперь мы можем проверить.
Установка нового пакета Laravel через composer.
Удаляем из composer.json нашего проекта локальный репазиторий, убираем зависимость «zloykolobok/modules»: «*»
Запускаем команду в консоли, находясь в корне нашего проекта
composer update
Пакет удален.
Удаляем файл конфигураций module.php из папки config.
И убираем из config/app.php (давайте просто закоментируем)
… Zloykolobok\Modules\ModulesServiceProvider::class, …
Все.
Теперь давайте установим наш пакет с помощью composer (уже не из локального репазитория)
Добавим зависимость в composer.json нвшего проекта
… "zloykolobok/modules": "dev-master" …
Ок. И теперь через консоль, находясь в корне нашего проекта запускаем команду
composer update
Вуаля, пакет скачался и установился.
Теперь нам необходимо опубликовать наш файл конфигурации. Тут нам поможет artisan. Выполняем команду:
php artisan vendor:publish
Все файл конфигураций для модулей в Laravel скопирован.
Отредактируем наш файл конфигураций (добавим модуль Test) и проверим. Все работает..
Заключение.
В этой статье мы с вами вынесли функционал реализации модульной системы в Laravel в отдельный пакет. Затем этот пакет опубликовали на github и зарегистрировали на packagist. Теперь в любом проекте на Laravel мы можем использовать модульную систему в Laravel установив пакет zloykolobok/modules с помощью composer.
Чтобы не пропустить выхода новых статей подписываемя: VK, twitter, facebook. И канал на youtube
Composer install, а не update, — сейчас пользователь сделает update по не знанию и получит кучу проблем. Вместе с установкой этого пакета обновятся другие пакеты. Ладно еще, если у него последняя версия всего установлена.
Да, можно и composer install. И если сделать composer update ничего страшного не будет. А если очень уж важна версия пакета, то фиксируйте ее в composer.json