Symfonyのconsoleコンポーネントで全てのコマンド共通のオプションを設定する
PHPでコンソールアプリを作るときに使うSymfonyのconsoleコンポーネントで全てのコマンドに共通のオプションをつける方法。
Symfony\Component\Console\Application
クラスを拡張して独自のApplication
クラスを作ってgetDefaultInputDefinition
メソッドをオーバーライドすれば共通のオプションを設定できます。
共通のオプションの値の取得はSymfony\Component\Console\Command\Command
を拡張したコマンドクラスで$input->getOption("オプション名")
を叩けば取得できます。
説明は面倒なのでコードを書いておきます。
Application
クラスのコード
<?php namespace HirotoK\Sample\Console; use Symfony\Component\Console\Application as SymfonyApplication; use Symfony\Component\Console\Input\InputOption; class Application extends SymfonyApplication { /** * ここで共通のオプションを追加する。ここで設定すればコマンドクラスから$input->getOption("オプション名")で取得できる。 * * @return \Symfony\Component\Console\Input\InputDefinition */ protected function getDefaultInputDefinition() { $definition = parent::getDefaultInputDefinition(); $definition->addOptions($this->getCommonOptions()); return $definition; } /** * InputOptionのインスタンスを返す。 * * @return InputOption[] */ protected function getCommonOptions() { $options = []; // ここらへんで配列にInputOptionを入れていく $options[] = new InputOption( "", // オプション名 null, // ショートカット InputOption::VALUE_REQUIRED, // 値の設定 "", // 説明 null // デフォルトの値 ); return $options; } }
コマンドクラス
<?php namespace HirotoK\Sample\Console\Commands; use Symfony\Component\Console\Command\Command; class TestCommand extends Command { /** * Configure * * @return void */ protected function configure() { $this ->setName("test") ->setDescription("テスト用"); } /** * Execute * * @param InputInterface $input * @param OutputInterface $output * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { var_dump($input->getOption("オプション名")); } }
使う時
<?php use HirotoK\Sample\Console\Application; use HirotoK\Sample\Console\Commands; $app = new Application($name, $version); // 使うコマンドを追加 $app->add(new Commands\TestCommand); $app->run();
Laravelでデータベースの接続を指定してmigrateやdb:seedを実行する
特定の接続でmigrate
やdb:seed
を実行する方法。
--database=DATABASE
を付けて実行すれば特定の接続で実行できる。
config/database.php
<?php return [ // 省略 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => database_path("database.sqlite"), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], 'pgsql' => [ 'driver' => 'pgsql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ], 'sqlsrv' => [ 'driver' => 'sqlsrv', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', ], 'testing' => [ 'driver' => 'sqlite', 'database' => database_path("testing.sqlite"), 'prefix' => '', ], ], //省略 ];
みたいな設定があってtesting
でのみ実行したいなら
php artisan migrate --database=testing php artisan db:seed --database=testing
で出来る。