【Laravel】テーブル定義からファクトリーファイルを自動生成するライブラリを作りました

Laravel

Laravelでは、ファクトリーファイルを使って、テストデータを簡単に準備することができます。

そんなファクトリーファイルですが、難点はファクトリーファイルに設定するカラム名を自分で定義しなければならないことです。

ファクトリーファイルを大量に作る必要があるときは、ファクトリーを一つずつ用意していたんですが、結構面倒な作業なんですよね。

いい加減面倒になったので、DBからテーブル定義を読み取って、カラム名が設定されたファクトリーファイルを生成する「laravel-factory-generator」というライブラリを作りました。

GitHub - aiiro/laravel-factory-generator: Make it easier to create laravel's factory file.
Make it easier to create laravel's factory file. Contribute to aiiro/laravel-factory-generator development by creating an account on GitHub.

ライブラリ自体は結構前から公開していたのですが、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”カラムを除外対象としています。

他に除外したいカラムがある場合は、配列にカラム名を追加してください。