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\Image
で placeholder.com を経由して行われているようなのだが、レスポンスステータスが 403 になっていた。
Stackoverflow で placeholder.com
が何か変更したか、 IP ブロックをしているみたいな話を見つけた。
"this is popular problem" って言ってるけど、他に類似の情報は見つけられなかった。(単なる自分の調査力不足かもしれない)
Faker\Provider\Image が非推奨になっていた
FakerPHP/Faker は v1.19.0 を利用していたのだが、v1.20.0 で非推奨になっていたようだ。
Marked the Faker\Provider\Image as deprecated
どうも外部サービスに依存するのってどうなのよ?不安定になっちゃわない?っていう理由らしい。(それっぽい議論をしている Issue や PR をいくつか見つけた)
どう対応するか
Provider is deprecated and will no longer be available in Faker 2. Please use a custom provider instead
非推奨のメッセージによれば、やりたいならカスタムプロバイダーを用意する必要がありそうだ。
生成元を placehold.jp
に差し替えるっていうネタも見つけたんだが、さすがにちょっとこれはやんちゃ過ぎるかなと。(一応それっぽくは動いた)
前述の Stackoverflow で紹介されていた smknstd/fakerphp-picsum-images も試してみたんだが、こちらも 403 になってしまうようだった。(imageUrl はこちらも大丈夫)