まえがき
Laravelを使ったことがある人は
artisan make:〇〇
コマンドでControllerやMiddleware作ったことがあると思いますが、開発をしていると〇〇Serviceや〇〇Adapterなど独自のクラスを同じように作りたい場面が出てきます。これはGeneratorCommandというクラスを継承すると簡単につくることができます。今回は〇〇Serviceというクラスを生成するコマンドをつくってみます。
コマンドクラスを生成
php artisan make:command ServiceMakeCommand
コマンドでServiceMakeCommand.phpが生成されます。このクラスにCommandではなくGeneratorCommandを継承させ、処理を書いていきます。
<?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という生成するクラスの骨組みを書いたファイルを用意します。
<?php
namespace DummyNamespace;
use App\Services\BaseService;
class DummyClass extends BaseService
{
}
<?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
<?php
namespace App\Services;
use App\Services\BaseService;
class FooService extends BaseService
{
}
php artisan make:service BarService --hogerable
<?php
namespace App\Services;
use App\Services\BaseService;
use App\Services\Hogerable;
class BarService extends BaseService
{
use Hogerable;
}
これらが生成されればOKです。