Laravel で一部だけ違うロケールのテストデータを生成する。

例えば、こんなプロジェクトがあるとする

日本向け*1のサービスをLaraelで開発していて、Fakerを使ってテストデータを生成している。 ある時、ユーザー名に英語表記*2をサービス内で保持する必要が出てきた。

どうやるか

Faker はFactoryパターンで実装されていて、createメソッドにロケールを渡すことで、指定されたロケールに合致するジェネレーターを返してくれる。

なので、一時的に欲しいロケールのジェネレーターを生成することで実現できる。 具体的には、デフォルトのロケール'ja'の環境でUserモデルのテストデータを生成するUserFactoryがあるとき、

<?php

use Faker\Generator as Faker;
use App\User;

$factory->define(User::class, function (Faker $faker) {
    $faker_en = \Faker\Factory::create('en_US');

    return [
        'name' => $faker->name,
        'firstName' => $faker_en->firstName,
        'lastName' => $faker_en->lastName,
        'email' => $faker->unique()->safeEmail
   ];
});

と、$faker_en を生成することで異なるロケールのデータを生成できる。

$faker->nameが生成した日本語名と$faker_enで生成した氏名が全然合致しないのは仕方がないが、そこに依存する機能でなければ十分使えるやり方だと思う。

*1:今回たまたまそうなだけで、どこでもいい

*2:これもどこの言語でもいい