【Laravel】TinkerでFakerを使う方法

どーも!

たかぽんです!

今回はFaker!

知っている人は知っているかもしれませんが、テスト用のデータを生成してくれるあいつです!

結構いろんなデータを作成することができるんですが、多すぎてこれで正しい値作れるのかなぁ・・・?

ってなりがちです...w

そこで、Tinkerでさくっとできないないかなぁ〜?と思い、試してみました!

では早速みていきましょう!

実際にTinkerで使ってみる

さて、それではいきなりですがw

実際に使ってみましょう!

このTinkerなんですが、実はPHPのライブラリの一つなんです。

基本的な使い方が書かれているページが以下にあります。

英語ですが、尻込みせずにいきましょう!

Generatorのインスタンスを作成し、そのインスタンスのプロパティとしてあらゆるダミーデータを取得することができるようです。

では、tinkerでやってみます!

tinkerについてご存知ない方は是非こちらも一読してみてください。

Takapon:MyProject taka$ php artisan tinker
Psy Shell v0.10.3 (PHP 7.3.9 — cli) by Justin Hileman
>>> use Faker\Factory as Faker
>>> $faker = Faker::create()
=> Faker\Generator {#2982}
>>> $faker->name
=> "Alphonso Casper"
>>> $faker->phoneNumber
=> "1-668-490-5048"

最初にtinkerを起動し、その後、`Faker\Factory`をuseしています。

そして、createメソッドで Faker\Generator インスタンスを生成し、あとはそのインスタンスのプロパティとしてnamephoneNumberにアクセスしてダミーデータを取得しています。

ちなみに、インスタンス作成時に特に値を渡さない場合(createメソッドの引数が無い場合)は、 self::DEFAULT_LOCALEが使用され、デフォルトで en_US(アメリカ仕様)になるようですね。

そのため、上記例ではアメリカ人っぽい名前、電話番号が生成されているわけです。

日本人っぽい名前や電話番号を生成したい場合は、以下のようにすれば可能です。

>>> $fakerJP = Faker::create('ja_JP');
=> Faker\Generator {#3031}
>>> $fakerJP->name
=> "宇野 真綾"
>>> $fakerJP->phoneNumber
=> "090-4902-5177"

generatorの生成時に'ja_JP'と指定をしてあげることで、日本人っぽいデータが生成できるようになります。

どんな風にデータが作られるのか追ってみた。

さて、ここからはざっと動作をみていきます。

このリポジトリの動作がわかればどんなデータが作られるのかもわかるので、少し難しいお話になりますが、頑張っていきましょう!

このFakerでは国ごとに特性があるデータはそれぞれ別のgeneratorとして先ほどja_JPを指定したように定義することができます。

ちなみに指定できる国は以下リポジトリのフォルダ内にあるフォルダ名の数だけあるようです。(多分、言語_国コード)

つまり、先ほどのcreateメソッドの引数として、このProvider配下にあるフォルダ名を指定してあげればその国のデータに特化したGeneratorが生成されるわけですね。

ちなみに、汎用性の高いデータに関しては全てのgenerator(どの国で指定しても)に共通して使えるようになっているみたいです。

Providerに直置きされているファイル(Address.phpやBarcode.php等...)はどの国でGeneratorを生成しても使えるわけです。

そして、国ごとの実際の値などは先ほどの共通のファイルをextendする形で、実際の国のフォルダの中にあるAddress.phpファイルで定義されているみたいですね!

では実際の例でみてみます。

例えばAddress.php...

Address.phpのファイルを見てもらえればわかりますが、たくさんのメソッドがあります。

そのメソッドがそれぞれGeneratorインスタンスのプロパティ名になります。

例えば最初のcitySuffixは以下の共通で使えるファイル(Provider/Address.php)に定義されています。

試しに日本、アメリカ、台湾のGeneratorで試してみました。

>>> $fakerJP->citySuffix
=> "市"
>>> $fakerEN->citySuffix
=> "burgh"
>>> $fakerTW->citySuffix
=> ""

なぜか台湾だと空文字が帰ってきましたね...

なるほど。

台湾の場合、台湾用のProvider/zh_TW/Address.phpファイルにて、共用のProvider/Address.phpをextend(継承)し、共通のメソッドが台湾用に上書き(オーバーライド)されて空文字がかえるようになっていますね。

念のため日本のAddress.phpもみてみましょう。

citySuffixなんてメソッドは存在していませんね・・・。

ただし、$citySuffixという変数が定義されていることに注目してください。

これも同じで、extendした共通の変数を上書きしています。

そのため、この日本用に$citySuffixとして定義された値array(市)を継承した元の共通ファイルのcitySuffixメソッドで使うわけです。(メソッドは上書きされていないため)

そして先ほどのTinkerで実行した"市"が出力されるわけですね!

さて、ここまで理解できた方はもう自分でどんな値が使われるか探せるようになっているのではないでしょうか...?

要約すると...

ja_JPファイルの中の.phpファイルにあるメソッドをかたっぱしから実行(プロパティアクセス)してみればとりあえず日本関連のやつ大体見れるよ!

それでもなかったら、Provider配下にある.phpファイルの中のメソッドもかたっぱしから実行してみるといいよ!

ってことです。

一応RepositoryのTopにも何となくの例は記載されていますが、特に国によって大きく異なる部分(日本だとカタカナ表記のもの)だけピックアップされているようです。

実際の値でどんなものが得られるのかは叩いてみるか、ファイルを覗いてみるのが手っ取り早そうですね。

まとめ

さて、今回はPHPでのダミーデータ生成メソッドをlaravelで軽く試してみました。

今度暇があったら日本語Generatorで生成できるものをリストアップとかしても面白そう...!

暇があったらですけどねっ...!

それでわ!

おすすめの記事