PHP
laravel
artisan
PHP7

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です。