E-kanのエンジニアの前中です。
普段、私はLaravelフレームワークを使用したシステムの保守案件に関わっているのですが、そういうエンジニアにとってmvcフレームワークのmodelを一から作る機会なんてものは滅多にありません。
今回私的なアプリを製作するにあたってmodelを作ろうとして覚えたことをメモしておきます。
modelって何?という説明は省略します。気になる方は↓のリンク先をどうぞ。
https://www.geekly.co.jp/column/cat-technology/1911_040/
modelを作成する方法として、古い人間が思いつくのは、サンプルとして配置されているmodelをコピペしてくること。
またはgoogle検索などでヒットしたmodelの記述を元に、一からphpファイルを作成することですね。
php初学者もこのアプローチを考えるのではないでしょうか。しかしこれは問題だらけです。
1.コピーミス(「}」が足りないとか)
2.typo(クラス名とか、あちこち)
3.ファイルパスを間違える(そんなファイルありませんと怒られる)
と、ミスの温床になります。え?どれもしょうもないミスでしょって?
こういうしょうもないミスは良くあるもので、これを減らすだけでもプログラミングはかなり楽になります。
そしてlaravelにはmodelを作成してくれるコマンドがあります。
php artisan make:model Area
これだけです。(上の例ではAreaがmodelの名前になります)
laravelのイントロダクションでもこれが書かれていて、実行すると以下のように空っぽのModelが作成されます。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Area extends Model
{
use HasFactory;
}
最低限のuse文とクラスの宣言しかありませんが、必須の参照は作成してくれますので、初学者が陥りがちなミスを減らしてくれます。
そうしてmodelを作成できたら、他にも作成しておきたいものがあります。
1.migrationファイル
2.Testファイル
3.Factoryファイル
4.Seederファイル
大雑把に言うと、migrationファイルはDBにテーブルを定義するためのファイルです。
これを作成しておくと、migrateというコマンドを使うことでテーブルを一括作成することができます。
TestファイルはPHPUnitというテスト自動化のためのもの。
FactoryファイルとSeederファイルはテストの時にテスト用データを生成するための機能と思っておけばOKです。システムの初期データを投入するのにも使えます。
……面倒ですね。(作成するのが)
ということで、これらもコマンドで作成できるのかな?と調べてみたところ、便利なコマンドがありました。
php artisan make:model Area --all
これだけです。
このコマンド1行で
model、migration、test、factory、seederに加えてcontrollerまで作成してくれます。
Model created successfully.
Factory created successfully.
Created Migration: 2021_12_09_034714_create_areas_table
Seeder created successfully.
Request created successfully.
Request created successfully.
Controller created successfully.
Policy created successfully.
こんな感じで作成されます。
Requestは名前通りPOSTなどのhttpリクエストの内容を扱うためのもので、Policyはアクションの認可を制御するためのクラスです。
あとは中身を書いていくだけ。typoしやすい人間には助かります。
……まとめて作ってくれるこっちのコマンドを標準にした方が良くないですか?
そう思うのは私だけ?
ちなみにテストファイルについては別のコマンドになります。
php artisan make:test Model/AreaTest --unit
Model/AreaTestは作成したいテストクラスの名前です。(Modelディレクトリ下に作成されます)
--unitはunitディレクトリに作成するためのオプションです。
Test created successfully.
作成成功と表示されればOKです。