Laravel 7.xの新しいカスタムstub(雛形)機能!実例

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、ここ数回お届けしているLaravel 7.xの新機能ですが、小さなものを含めるとまだまだ便利なものが存在しています。

そして、そんな中から「これはいい!」と思った機能がありました。

それは・・・

カスタムstub(雛形)機能

です。

まず、stubとは何かですが、例えば次のようなartisanコマンドを実行したときをイメージしてください。

php artisan make:model Post

この場合、以下のようなModelファイルが作成されますよね。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

これは元々どこから来ているかというと、

/vendor/laravel/framework/src/Illuminate/Foundation/Console/stubs/model.stub

というファイルで、中身はこのようになっています。

<?php

namespace {{ namespace }};

use Illuminate\Database\Eloquent\Model;

class {{ class }} extends Model
{
    //
}

つまり、コマンドで作成されるファイルのもとになるものが「stub」と呼ばれています。

そして、今回のアップデートでstubを自分用に変更することができるという機能が追加になったというわけです。

そこで!

今回はこのカスタムstubを作る方法をご紹介したいと思います。

ぜひ皆さんのお役に立てると嬉しいです😊✨

開発環境: Laravel 7.x

カスタム stub の使い方

まず、新しく追加されたstub:publishコマンドを実行します。

php artisan stub:publish

すると、stubsというフォルダが作成され、中にstubファイルが設置されています。

後は、このstubを好きに変更すればartisan make:*****で作成されるファイルに適用されることになります。

どんなカスタマイズが考えられるか?

カスタムstubは、便利ですがシンプルな機能なので使い方はここまででおしまいです。

ただ、それだけでは記事としては面白くないのでここからは「どんなカスタマイズが考えられるか?」というテーマでいくつか作ってみました。

ぜひ参考になると嬉しいです。

モデル編

MassAssignmentException対策

LaravelでDBにデータを追加する場合にたまに遭遇するのがMassAssignmentExceptionですが、これはモデルに、

  • どのフィールドを守るか
  • もしくは、どのフィールドに書き込みを許可するか

を指定することで解決できます。

そして、これを見越したstubがこちらです。(idを書き込み不可にすることが大多数だと思いますのでデフォルトでこれでもいいような気がしますね😊)

<?php

namespace {{ namespace }};

use Illuminate\Database\Eloquent\Model;

class {{ class }} extends Model
{
    protected $guarded = ['id'];
}

各ブロックに説明を追加する

Laravelのモデルは多数の機能を備えているので、ときにはたくさんのコードを追加で書き込むことになります。

しかし、コード量が増えるとさすがに保守管理しにくくなってしまうので、せめて機能ごとにブロック分けして記述するようにしています。

そんなときに役立つstubです。(共同で作業する場合に書く場所が共通になっていいかもしれません)

<?php

namespace {{ namespace }};

use Illuminate\Database\Eloquent\Model;

class {{ class }} extends Model
{
    // コンフィグ

    // グローバル・スコープ

    // リレーション

    // Accessor

    // Mutator

    // ローカル・スコープ

    // その他
}

Laravel開発・ビギナー用stub

もしくは、開発者の中にLaravelのビギナーがいる場合は次のようにドキュメントURLを追加してもいいかもしれません。

<?php

namespace {{ namespace }};

use Illuminate\Database\Eloquent\Model;

class {{ class }} extends Model
{
    /*
    * コンフィグ
    * https://laravel.com/docs/7.x/eloquent#eloquent-model-conventions
    */

    /*
    * グローバル・スコープ
    * https://laravel.com/docs/7.x/eloquent#global-scopes
    */

    /*
    * リレーションシップ
    * https://laravel.com/docs/7.x/eloquent-relationships
    */

    /*
    * Accessor
    * https://laravel.com/docs/7.x/eloquent-mutators#defining-an-accessor
    */

    /*
    * Mutator
    * https://laravel.com/docs/7.x/eloquent-mutators#defining-a-mutator
    */

    /*
    * ローカル・スコープ
    * https://laravel.com/docs/7.x/eloquent#local-scopes
    */

    /*
    * その他
    * https://laravel.com/
    */
}

マイグレーション編

使う頻度が高いフィールドタイプを追加しておく

マイグレーションを設定するときによく使うフィールドのコードサンプルを作っておけば、コピーするだけで使えますし、不要なら簡単に削除もできます。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class {{ class }} extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('{{ table }}', function (Blueprint $table) {
            $table->id();
//            $table->string('*****');
//            $table->text('*****');
//            $table->integer('*****');
//            $table->boolean('*****');
//            $table->date('*****');
//            $table->dateTime('*****');
//            $table->time('*****');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('{{ table }}');
    }
}

使う頻度が高いその他の設定を追加しておく

私の場合、マイグレーションを書く時、特に「外部キー」の書き方を忘れてしまいがちなので、それに加えて、使う頻度が高いコードのサンプルを先に記述しておくと便利ではないでしょうか。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class {{ class }} extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('{{ table }}', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

//            $table->foreign('user_id')->references('id')->on('users');
//            $table->index('user_id');
//            $table->unique('email');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('{{ table }}');
    }
}

コントローラー編

ミドルウェアを設定しておく

個人的にはミドルウェアはルートで使うことが多いのですが、コントローラーでミドルウェアを設定したい方は以下のstubが便利だと思います。

<?php

namespace {{ namespace }};

use {{ rootNamespace }}Http\Controllers\Controller;
use Illuminate\Http\Request;

class {{ class }} extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
//        $this->middleware('log')->only('index');
//        $this->middleware('subscribed')->except('store');
    }
}
開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで、今回はLaravel 7.xで新しく追加された「カスタムstub」機能をご紹介しました。

おそらく、開発環境やチーム内で個々に記述のルールがあると思いますのでstubをカスタマイズすることでも対応ができるんじゃないかと思います。

ぜひ皆さんも使ってみてくださいね。

ではでは〜!

このエントリーをはてなブックマークに追加       follow us in feedly