はじめに
最近LaravelでartisanのCommand作ってパッケージ化するというようなことがあったのでその際に得たTipsをまとめて見たいと思います。
継承元
今回はmake:controller
のように新しくファイルを作成するようなコマンドを作りたかったのでIlluminate/Console/GeneratorCommand
を継承して作りました。
GeneratorCommand
はディレクトリ生成したり、ファイルの存在判定のメソッドが定義されていたりするのでここを継承すると楽にファイル操作関連のコマンドを作れます。
テンプレート
ファイル生成するときはテンプレートがあると楽です。
make:controller
などであればIlluminate/Routing/Console/stubs
以下にあるstubでコントローラーファイルの雛形を用意しておき、コマンド実行時にNamespaceやClassをstr_replace
で置き換えるみたいなことをやっています。
自作するときも生成したいファイルの雛形作っておけばある程度自由度高くできるので使いやすいなと思いました。
ServiceProvider
普通にlaravelでコマンド作るときはapp/Console/Kernel
に追加しておけば勝手に登録してくれますがパッケージ化したい場合などはServiceProviderで登録するのがいいかと思います。
registerメソッドでこんな感じで登録します。
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->registerMakeHogeCommand();
}
/**
* Register the make:hoge Command
*/
private function registerMakeHogeCommand()
{
$this->app->singleton('command.make.hoge', function ($app) {
return new MakeHogeCommand();
});
$this->commands('command.make.hoge');
}
Illuminate/Foundation/Providers/ArtisanServiceProvider
とか見るとわかりやすいと思います。
設定ファイル
これは別にコマンドに限った話ではありませんがパッケージの設定ファイルだけlaravelのconfigに組み込みたいときはServiceProviderにこんな感じで書いて、
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->publishes([
__DIR__.'/config_path/make_hoge_config.php' => config_path('make_hoge_config.php'),
]);
}
php artisan vendor:publish
コマンドをたたいて貰えればlaravleのconfigに組み込めます。
オプション
コマンドのオプションですがコマンドのsignatureプロパティに{--option=default}
を付け足したりして指定できます。参考→https://readouble.com/laravel/5.3/ja/artisan.html
ショートカットで使いたい場合は{--o|option=default}
で、単にオプションの指定があったかどうかboolで受け取りたい場合は{--o|option}
みたいな感じです。
入力を配列で受け取りたい場合は{--o|option=*}
でphp artisan -o option1 -o option2 command
みたいな感じで受け取れます。
他のパッケージのコードとか見てるとphp artisan -o option1,option2 command
で受け取って,
でexplodeするみたいなやり方をしてるものもありました。
まとめ
というわけで紹介みたいになってしまいましたがこんな感じです。
既存のコマンドとか見ると参考になると思います。