Edited at

artisan コマンドで独自クラスのスケルトンをつくる


まえがき

Laravelを使ったことがある人は

artisan make:〇〇

コマンドでControllerやMiddleware作ったことがあると思いますが、開発をしていると〇〇Serviceや〇〇Adapterなど独自のクラスを同じように作りたい場面が出てきます。これはGeneratorCommandというクラスを継承すると簡単につくることができます。今回は〇〇Serviceというクラスを生成するコマンドをつくってみます。


コマンドクラスを生成

php artisan make:command ServiceMakeCommand

コマンドでServiceMakeCommand.phpが生成されます。このクラスにCommandではなくGeneratorCommandを継承させ、処理を書いていきます。


App/Console/CommandsにServiceMakeCommand.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputOption;

class ServiceMakeCommand extends GeneratorCommand
{
/**
* The name and signature of the console command.
*
* @var string
*/

protected $signature = 'make:service {name} {--hogerable : use Hogerable trait}';

/**
* The console command description.
*
* @var string
*/

protected $description = 'Create a new service class';

/**
* The type of class being generated.
*
* @var string
*/

protected $type = 'Service';

/**
* Get the stub file for the generator.
*
* @return string
*/

protected function getStub()
{
return $this->option('hogerable')
? __DIR__.'/stubs/hogerable-service.stub'
: __DIR__.'/stubs/service.stub';
}

/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/

protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Services';
}
}


これでphp artisan make:service クラス名でクラスを生成するコマンドができました。今回は--hogerableオプションがある場合はHogerableトレイトをuseしたクラス生成することにしました。

次にstubという生成するクラスの骨組みを書いたファイルを用意します。


app/Console/Commands/stubs/service.stub

<?php

namespace DummyNamespace;

use App\Services\BaseService;

class DummyClass extends BaseService
{

}



app/Console/Commands/stubs/hogerable-service.stub


<?php

namespace DummyNamespace;

use App\Services\BaseService;
use App\Services\Hogerable;

class DummyClass extends BaseService
{
use Hogerable;
}


最後にapp/Console/Kernel.phpにServiceMakeCommandを登録しましょう。

php artisan make:service FooService


app/Services/FooService.php

<?php

namespace App\Services;

use App\Services\BaseService;

class FooService extends BaseService
{

}


php artisan make:service BarService --hogerable


app/Services/BarService.php

<?php

namespace App\Services;

use App\Services\BaseService;
use App\Services\Hogerable;

class BarService extends BaseService
{
use Hogerable;
}


これらが生成されればOKです。