FakerPHP/Faker で \Faker\Generator::image が使えない #php #laravel

概要

Laravel の Factory で画像のテストデータを作ろうとして $this->faker->image(storage_path('app/public/images')) とかやっても、画像ファイルがうまく生成されず、画像ファイル名も 0 とかで生成されてしまう。

v1.20.0 で非推奨になっており、 Faker2 では削除されるようだ。

カスタムプロバイダーを使うように変更して対応する必要がありそう。

false が返ってきている

tinker を使って試してみると、 false が返ってきている。

ついでに試してみた imageUrl はうまくいっているように見える。

$ sail tinker
Psy Shell v0.11.5 (PHP 8.1.9 — cli) by Justin Hileman
>>> $faker = \Illuminate\Container\Container::getInstance()->make(\Faker\Generator::class);
=> Faker\Generator {#3653}

>>> $faker->image(storage_path('app/public/images'));
=> false

>>> $faker->imageUrl();
=> "https://via.placeholder.com/640x480.png/00aa44?text=quo"

placeholder.com によるブロック?

もう少し追いかけてみると、テスト画像の生成は \Faker\Provider\Imageplaceholder.com を経由して行われているようなのだが、レスポンスステータスが 403 になっていた。

Stackoverflow で placeholder.com が何か変更したか、 IP ブロックをしているみたいな話を見つけた。

"this is popular problem" って言ってるけど、他に類似の情報は見つけられなかった。(単なる自分の調査力不足かもしれない)

stackoverflow.com

Faker\Provider\Image が非推奨になっていた

FakerPHP/Faker は v1.19.0 を利用していたのだが、v1.20.0 で非推奨になっていたようだ。

Marked the Faker\Provider\Image as deprecated

github.com

どうも外部サービスに依存するのってどうなのよ?不安定になっちゃわない?っていう理由らしい。(それっぽい議論をしている Issue や PR をいくつか見つけた)

どう対応するか

Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead

非推奨のメッセージによれば、やりたいならカスタムプロバイダーを用意する必要がありそうだ。

生成元を placehold.jp に差し替えるっていうネタも見つけたんだが、さすがにちょっとこれはやんちゃ過ぎるかなと。(一応それっぽくは動いた)

stackoverflow.com

前述の Stackoverflow で紹介されていた smknstd/fakerphp-picsum-images も試してみたんだが、こちらも 403 になってしまうようだった。(imageUrl はこちらも大丈夫)

github.com