Laravelでは、ファクトリーファイルを使って、テストデータを簡単に準備することができます。
そんなファクトリーファイルですが、難点はファクトリーファイルに設定するカラム名を自分で定義しなければならないことです。
ファクトリーファイルを大量に作る必要があるときは、ファクトリーを一つずつ用意していたんですが、結構面倒な作業なんですよね。
いい加減面倒になったので、DBからテーブル定義を読み取って、カラム名が設定されたファクトリーファイルを生成する「laravel-factory-generator」というライブラリを作りました。
ライブラリ自体は結構前から公開していたのですが、DBに存在する全てのテーブルのファクトリーファイルを生成する機能を追加して、使い勝手が良くなったと思うので良ければ試しに使ってみてください。
※Laravelのバージョンは5.5以上を対象としています。
laravel-factory-generatorのインストール方法
laravel-factory-generatorはcomposerを使ってインストールできます。
$ composer require --dev aiiro/laravel-factory-generator
ファクトリーファイルの生成
laravel-factory-generatorはDBからテーブル定義を読み取って動作します。
そのため、コマンドを実行する環境からDBに接続できるように設定してください。
特定のテーブルに対応するファクトリーを生成する
テーブル名を指定することで、指定したテーブルのファクトリーファイルを生成できます。
$ php artisan generate:factory テーブル
コマンドを実行すると、”database/factories”配下にファクトリーファイルが出力されます。
カラムに対応する値は”null”になっていますので、好きな設定に変更してください。
<?php
use Faker\Generator as Faker;
use App\Sample;
$factory->define(Sample::class, function (Faker $faker) {
return [
'foo' => null,
'created_at' => null,
'updated_at' => null,
];
});
全てのテーブルに対応するファクトリーを生成する
次のように、”–all”オプションを指定してコマンドを実行することで、全テーブルのファクトリーファイルを作成します。
ファクトリーファイルが既に存在する場合は、スキップして他のファクトリーファイルを生成します。
$ php artisan generate:factory --all
laravel-factory-generatorの設定
laravel-factory-generatorの設定を変更したい場合は、”vendor:publish”で設定ファイルをコピーします。
下記のコマンドを実行すると、configディレクトリに”config/factory-generator.php”が作成されます。
php artisan vendor:publish --provider="Aiiro\Factory\FactoryGeneratorServiceProvider"
useするモデルのネームスペースを設定
<?php
return [
/**
* Set the namespace of the model.
*/
'namespace' => [
'model' => 'App',
],
/**
* List of the columns that will not appear in the factory.
*/
'ignored_columns' => [
'id',
],
];
キー名”model”の値を変更することで、はモデルのネームスペースを変更できます。
例えば”App”を”App\Models”に変更すると、次のようにuseするモデルファイルのネームスペースが”App\Models”となります。
<?php
use Faker\Generator as Faker;
use App\Models\Sample;
$factory->define(Sample::class, function (Faker $faker) {
return [
'number' => null,
'created_at' => null,
'updated_at' => null,
];
});
ファクトリーファイルから除外したいカラムを設定
“ignored_columns”では、ファクトリーファイルから除外したいカラムを設定することができます。
デフォルトでは”id”カラムを除外対象としています。
他に除外したいカラムがある場合は、配列にカラム名を追加してください。