
九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、ここ数回お届けしている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');
}
}
おわりに
ということで、今回はLaravel 7.x
で新しく追加された「カスタムstub」機能をご紹介しました。
おそらく、開発環境やチーム内で個々に記述のルールがあると思いますのでstub
をカスタマイズすることでも対応ができるんじゃないかと思います。
ぜひ皆さんも使ってみてくださいね。
ではでは〜!