Один из основных вопросов в Laravel - как лучше устанавливать пакеты. Традиционно мы имеем неприятную часть файла readme, которая содержит подобную инструкцию: %%(sh) php artisan config:publish rtablada/laravel-faq %% Это не очень сложно, но может быть немного запутанным и длинным. Гораздо приятнее было бы иметь команду наподобие: %%(sh) php artisan faq:config %% Она короче, слаще и удобнее. Итак, для начала мы создадим для наших команд пространство имен в консоли. Начнем с написания кода-заглушки в %%(t)src/Rtablada/LaravelFaq/Console/ConfigureCommand.php%%: %% call('config:publish', array('package' => 'rtablada/laravel-faq')); } } %% Теперь перейдем к хитростям. Вчера мы ((24 сделали взаимодействие наших моделей с БД более гибким)). Это очень здорово, но становится немного неудобно выполнять миграции. Мы могли бы создать забавные миграции, которые меняют подключение по умолчанию, но это было бы немного неряшливо и ресурсоёмко. К счастью, у команды %%(t)artisan migrate%% есть флаг %%(t)--database%%, который указывает какое подключение надо использовать. Поэтому команда миграции для нашего пакета будет такой: %%(sh) php artisan migrate --package="rtablada/laravel-faq" --database="faq" %% Команда по-прежнему вполне читаема, но давайте сделаем её %%(sh)php artisan faq:migrate%% %% class MigrateCommand extends Command { protected $name = 'faq:migrate'; protected $description = 'Выполняет миграции для Laravel FAQ.'; public function fire() { $this->call('migrate', array('--package' => 'rtablada/laravel-faq', '--database' => 'faq')); } } %% Последняя незначительная команда, которую я хочу добавить - это %%(sh)php artisan asset:publish rtablada/laravel-faq%%: %% class AssetsCommand extends Command { protected $name = 'faq:assets'; protected $description = 'Публикует внешние ресурсы Laravel FAQ.'; public function fire() { $this->call('asset:publish', array('package' => 'rtablada/laravel-faq')); } } %% Наконец, давайте соберем все это в одну команду установки: %% class InstallCommand extends Command { protected $name = 'faq:assets'; protected $description = 'Публикует внешние ресурсы Laravel FAQ.'; public function fire() { $this->call('faq:config'); $this->call('faq:assets'); if ($this->confirm('Вы уже настроили БД?')) { $this->call('faq:config'); } else { $this->comment('БД ещё не была мигрирована, перед использованием выполните artisan faq:migrate'); } } } %% В установщик добавлена функция подтверждения %%(t)confirm%%. Она будет приостанавливать выполнение команды миграции, пока пользователь настраивает БД. Если пользователь ответит "нет", тогда она сообщит ему о необходимости провести миграцию вручную перед использованием. Теперь, когда у нас есть команды, нам надо зарегистрировать их в нашем %%(t)src/rtablada/LaravelFaq/LaravelFaqServiceProvider%%: %% public function register() { $this->registerCommands(); } public function registerCommands() { $this->registerMigrateCommand(); $this->registerConfigureCommand(); $this->registerAssetsCommand(); $this->registerInstallCommand(); $this->commands( 'laravel-faq::commands.migrate', 'laravel-faq::commands.config', 'laravel-faq::commands.assets', 'laravel-faq::commands.install' ); } public function registerMigrateCommand() { $this->app['laravel-faq::commands.migrate'] = $this->app->share(function($app) { return new Console\MigrateCommand; }); } public function registerConfigureCommand() { $this->app['laravel-faq::commands.config'] = $this->app->share(function($app) { return new Console\ConfigureCommand; }); } public function registerAssetsCommand() { $this->app['laravel-faq::commands.assets'] = $this->app->share(function($app) { return new Console\AssetsCommand; }); } public function registerInstallCommand() { $this->app['laravel-faq::commands.install'] = $this->app->share(function($app) { return new Console\InstallCommand; }); } %% Таким образом, за несколько минут мы сделали процесс установки более простым, более гибким и менее предрасположенным к ошибкам.