Posted at

Laravelで自作コマンドを作るときのTips

More than 1 year has passed since last update.


はじめに

最近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するみたいなやり方をしてるものもありました。


まとめ

というわけで紹介みたいになってしまいましたがこんな感じです。

既存のコマンドとか見ると参考になると思います。