[{"data":1,"prerenderedAt":549},["ShallowReactive",2],{"article-laravel-custom-faker":3},{"id":4,"title":5,"body":6,"category":535,"createdAt":537,"description":538,"extension":539,"index":540,"meta":541,"navigation":107,"path":542,"publish":107,"seo":543,"series":540,"seriesTitle":540,"stem":544,"tag":545,"thumbnail":547,"updatedAt":540,"__hash__":548},"articles\u002Farticles\u002Flaravel-custom-faker.md","Laravelでカスタムなフェイカーを作成する。",{"type":7,"value":8,"toc":526},"minimark",[9,13,24,27,57,60,63,68,82,88,126,133,146,150,157,215,218,221,224,227,233,409,427,430,439,501,508,511,514,522],[10,11,12],"p",{},"こんにちはjunです。Laravelはフルスタックフレームワークと言われるほど開発者に嬉しい機能が揃っています。その中でFakerと呼ばれるダミーデータを挿入する機能はよく使用します。ページングやいろんな文字を入れてみて、ビュー側やロジックなどが問題ないかを確かめることができるので、効率的な開発には必要不可欠です。",[10,14,15,16,23],{},"Fakerは標準で英語ですが、設定によって日本語にすることができます。FakerはPHPfakerというDevライブラリを使用しており、",[17,18,22],"a",{"href":19,"rel":20},"https:\u002F\u002Ffakerphp.github.io\u002Fformatters\u002Fnumbers-and-strings\u002F",[21],"nofollow","PHP Faker Formatters","で使用できるFakerの一覧を見れます。これらのFakerはおもにFactoryで使用します。",[10,25,26],{},"例えば氏名、メールアドレス、文章などは以下の通りです。",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-php shiki shiki-themes material-theme-ocean","$this->faker->name();\n$this->faker->email();\n$this->faker->realText();\n","php","",[35,36,37,45,51],"code",{"__ignoreMap":33},[38,39,42],"span",{"class":40,"line":41},"line",1,[38,43,44],{},"$this->faker->name();\n",[38,46,48],{"class":40,"line":47},2,[38,49,50],{},"$this->faker->email();\n",[38,52,54],{"class":40,"line":53},3,[38,55,56],{},"$this->faker->realText();\n",[10,58,59],{},"上記の通りそれっぽいダミーデータを作れるのですが、時たまにアプリで必要なデータ形式のFakerがほしかったり、ランダム・特定条件のマスターのIDを出してほしい、もう少し実装するサービスに即した内容を出してほしいと言った要望がある場合はFakerを自作する必要があります。",[10,61,62],{},"今回はそのカスタムFakerの実装を解説したいと思います。",[64,65,67],"h2",{"id":66},"カスタムfakerのクラスを作成","カスタムFakerのクラスを作成",[10,69,70,71,74,75,78,79,81],{},"最初にカスタムFakerのクラスを作成します。",[35,72,73],{},"App\u002FFaker\u002FCustome.php","を作成します。今回は",[35,76,77],{},"Custome.php","に実装したいFakerを作成しますが、もしクラスごとにわたい場合は",[35,80,77],{},"をFakerごとのクラスに分けてください。",[10,83,84,85,87],{},"そして",[35,86,77],{},"は以下のように記述します。",[28,89,91],{"className":30,"code":90,"filename":73,"language":32,"meta":33,"style":33},"namespace App\\Faker;\nuse Faker\\Provider\\Base;\n\nclass Custome extends Base{\n\n}\n\n",[35,92,93,98,103,109,115,120],{"__ignoreMap":33},[38,94,95],{"class":40,"line":41},[38,96,97],{},"namespace App\\Faker;\n",[38,99,100],{"class":40,"line":47},[38,101,102],{},"use Faker\\Provider\\Base;\n",[38,104,105],{"class":40,"line":53},[38,106,108],{"emptyLinePlaceholder":107},true,"\n",[38,110,112],{"class":40,"line":111},4,[38,113,114],{},"class Custome extends Base{\n",[38,116,118],{"class":40,"line":117},5,[38,119,108],{"emptyLinePlaceholder":107},[38,121,123],{"class":40,"line":122},6,[38,124,125],{},"}\n",[10,127,128,129,132],{},"ここでは",[35,130,131],{},"Faker\\Provider\\Base","を継承させてください。Fakerの元ファイルもFakerメソッドを定義しているクラスで継承しています。",[10,134,135,137,138,141,142,145],{},[35,136,131],{},"からは",[35,139,140],{},"randomElements()","といったランダムな配列を取得する、任意範囲の数字を取得する",[35,143,144],{},"numberBetween()","といった便利なメソッドを使用できます。",[147,148,149],"h3",{"id":149},"フェイカーの書き方",[10,151,152,153,156],{},"例えば、食品の名前を出してくれる",[35,154,155],{},"foodname()","というFakerを作ってみるとします。",[28,158,160],{"className":30,"code":159,"filename":73,"language":32,"meta":33,"style":33},"namespace App\\Faker;\nuse Faker\\Provider\\Base;\n\nclass Custome extends Base{\n\n     protected static $foodName = ['ラーメン','パスタ','おにぎり','パン','炒飯']\n\n     public function foodname(){\n        return static::randomElement(static::$foodName);\n     }\n}\n\n",[35,161,162,166,170,174,178,182,187,192,198,204,210],{"__ignoreMap":33},[38,163,164],{"class":40,"line":41},[38,165,97],{},[38,167,168],{"class":40,"line":47},[38,169,102],{},[38,171,172],{"class":40,"line":53},[38,173,108],{"emptyLinePlaceholder":107},[38,175,176],{"class":40,"line":111},[38,177,114],{},[38,179,180],{"class":40,"line":117},[38,181,108],{"emptyLinePlaceholder":107},[38,183,184],{"class":40,"line":122},[38,185,186],{},"     protected static $foodName = ['ラーメン','パスタ','おにぎり','パン','炒飯']\n",[38,188,190],{"class":40,"line":189},7,[38,191,108],{"emptyLinePlaceholder":107},[38,193,195],{"class":40,"line":194},8,[38,196,197],{},"     public function foodname(){\n",[38,199,201],{"class":40,"line":200},9,[38,202,203],{},"        return static::randomElement(static::$foodName);\n",[38,205,207],{"class":40,"line":206},10,[38,208,209],{},"     }\n",[38,211,213],{"class":40,"line":212},11,[38,214,125],{},[10,216,217],{},"このような感じで、配列に静的なプロパティを作成します。そしてメソッドでそのリストからランダムで呼び出す処理を実装すれば大丈夫です。DB上にあるマスターなどを使用したい場合、DBと接続して取得してもいいと思います。",[10,219,220],{},"引数を設定できるので、特定の食品だけ取り出すみたいな処理を加えていいでしょう。まずカスタムFakerメソッドを実装できたので、実際に使えるようにします。",[64,222,223],{"id":223},"サービスプロバイダを作成",[10,225,226],{},"Laravelの標準のFakerはサービスプロバイダでシングルトンとして登録されています。それをオーバーライドするような処理を行っています。",[10,228,229,232],{},[35,230,231],{},"App\u002FProviders\u002FFakerServiceProvider.php","配下にサービスプロバイダを作成します。",[28,234,236],{"className":30,"code":235,"filename":231,"language":32,"meta":33,"style":33},"\nnamespace App\\Providers;\nuse Faker\\{Factory, Generator};\nuse Illuminate\\Support\\ServiceProvider;\nuse App\\Faker\\Custome;\n\nclass FakerServiceProvider extends ServiceProvider\n{\n    \u002F**\n     * Register services.\n     *\n     * @return void\n     *\u002F\n    public function register()\n    {\n        $this->app->singleton(Generator::class, function () {\n            $faker = Factory::create(config('app.faker_locale'));\n            $faker->addProvider(new Custome($faker));\n            return $faker;\n        });\n    }\n\n    \u002F**\n     * Bootstrap services.\n     *\n     * @return void\n     *\u002F\n    public function boot()\n    {\n        \u002F\u002F\n    }\n}\n",[35,237,238,242,247,252,257,262,266,271,276,281,286,291,297,303,309,315,321,327,333,339,345,351,356,361,367,372,377,382,388,393,399,404],{"__ignoreMap":33},[38,239,240],{"class":40,"line":41},[38,241,108],{"emptyLinePlaceholder":107},[38,243,244],{"class":40,"line":47},[38,245,246],{},"namespace App\\Providers;\n",[38,248,249],{"class":40,"line":53},[38,250,251],{},"use Faker\\{Factory, Generator};\n",[38,253,254],{"class":40,"line":111},[38,255,256],{},"use Illuminate\\Support\\ServiceProvider;\n",[38,258,259],{"class":40,"line":117},[38,260,261],{},"use App\\Faker\\Custome;\n",[38,263,264],{"class":40,"line":122},[38,265,108],{"emptyLinePlaceholder":107},[38,267,268],{"class":40,"line":189},[38,269,270],{},"class FakerServiceProvider extends ServiceProvider\n",[38,272,273],{"class":40,"line":194},[38,274,275],{},"{\n",[38,277,278],{"class":40,"line":200},[38,279,280],{},"    \u002F**\n",[38,282,283],{"class":40,"line":206},[38,284,285],{},"     * Register services.\n",[38,287,288],{"class":40,"line":212},[38,289,290],{},"     *\n",[38,292,294],{"class":40,"line":293},12,[38,295,296],{},"     * @return void\n",[38,298,300],{"class":40,"line":299},13,[38,301,302],{},"     *\u002F\n",[38,304,306],{"class":40,"line":305},14,[38,307,308],{},"    public function register()\n",[38,310,312],{"class":40,"line":311},15,[38,313,314],{},"    {\n",[38,316,318],{"class":40,"line":317},16,[38,319,320],{},"        $this->app->singleton(Generator::class, function () {\n",[38,322,324],{"class":40,"line":323},17,[38,325,326],{},"            $faker = Factory::create(config('app.faker_locale'));\n",[38,328,330],{"class":40,"line":329},18,[38,331,332],{},"            $faker->addProvider(new Custome($faker));\n",[38,334,336],{"class":40,"line":335},19,[38,337,338],{},"            return $faker;\n",[38,340,342],{"class":40,"line":341},20,[38,343,344],{},"        });\n",[38,346,348],{"class":40,"line":347},21,[38,349,350],{},"    }\n",[38,352,354],{"class":40,"line":353},22,[38,355,108],{"emptyLinePlaceholder":107},[38,357,359],{"class":40,"line":358},23,[38,360,280],{},[38,362,364],{"class":40,"line":363},24,[38,365,366],{},"     * Bootstrap services.\n",[38,368,370],{"class":40,"line":369},25,[38,371,290],{},[38,373,375],{"class":40,"line":374},26,[38,376,296],{},[38,378,380],{"class":40,"line":379},27,[38,381,302],{},[38,383,385],{"class":40,"line":384},28,[38,386,387],{},"    public function boot()\n",[38,389,391],{"class":40,"line":390},29,[38,392,314],{},[38,394,396],{"class":40,"line":395},30,[38,397,398],{},"        \u002F\u002F\n",[38,400,402],{"class":40,"line":401},31,[38,403,350],{},[38,405,407],{"class":40,"line":406},32,[38,408,125],{},[10,410,411,414,415,418,419,422,423,426],{},[35,412,413],{},"Factory::create(config('app.faker_locale'))","としておくと、",[35,416,417],{},"config\u002Fapp.php","の",[35,420,421],{},"faker_locale","を用いて日本語化できます。そしてFakerのインスタンスに",[35,424,425],{},"addProvider()","を使用して、作成したカスタムフェイカーを追加します。",[147,428,429],{"id":429},"サービスプロバイダの登録",[10,431,432,433,418,435,438],{},"このサービスプロバイダを",[35,434,417],{},[35,436,437],{},"providers"," に追加します。",[28,440,442],{"className":30,"code":441,"filename":417,"language":32,"meta":33,"style":33},"'providers' => [\n\u002F*\n* Laravel Framework Service Providers...\n*\u002F\n\u002F\u002F 省略\n\n\u002F*\n* Application Service Providers...\n　追加\n*\u002F\n    App\\Providers\\FakerServiceProvider::class,\n],\n",[35,443,444,449,454,459,464,469,473,477,482,487,491,496],{"__ignoreMap":33},[38,445,446],{"class":40,"line":41},[38,447,448],{},"'providers' => [\n",[38,450,451],{"class":40,"line":47},[38,452,453],{},"\u002F*\n",[38,455,456],{"class":40,"line":53},[38,457,458],{},"* Laravel Framework Service Providers...\n",[38,460,461],{"class":40,"line":111},[38,462,463],{},"*\u002F\n",[38,465,466],{"class":40,"line":117},[38,467,468],{},"\u002F\u002F 省略\n",[38,470,471],{"class":40,"line":122},[38,472,108],{"emptyLinePlaceholder":107},[38,474,475],{"class":40,"line":189},[38,476,453],{},[38,478,479],{"class":40,"line":194},[38,480,481],{},"* Application Service Providers...\n",[38,483,484],{"class":40,"line":200},[38,485,486],{},"　追加\n",[38,488,489],{"class":40,"line":206},[38,490,463],{},[38,492,493],{"class":40,"line":212},[38,494,495],{},"    App\\Providers\\FakerServiceProvider::class,\n",[38,497,498],{"class":40,"line":293},[38,499,500],{},"],\n",[10,502,503,504,507],{},"そうするとfakerにて",[35,505,506],{},"$this->faker->foodname()","でランダムな食品名が出てきます。",[64,509,510],{"id":510},"すぐに検証したい場合の方法",[10,512,513],{},"上記のFakerはFactoryなどで使用できますが、Tinkerなどですぐに確かめたいということがあると思います。そんな時はTinkerで以下のようにFakerのインスタンスを生成して、チェックできます。なお上記のサービスプロバイダーを登録している必要があります。",[28,515,520],{"className":516,"code":518,"language":519},[517],"language-text","php artian tinker\n>> $faker = app()->make(Faker\\Generator::class)\n>> $faker->foodname()\n=>'パスタ'\n","text",[35,521,518],{"__ignoreMap":33},[523,524,525],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":33,"searchDepth":53,"depth":53,"links":527},[528,531,534],{"id":66,"depth":47,"text":67,"children":529},[530],{"id":149,"depth":53,"text":149},{"id":223,"depth":47,"text":223,"children":532},[533],{"id":429,"depth":53,"text":429},{"id":510,"depth":47,"text":510},[536],"ministack","2022-04-02","Laravelでのカスタムフェイカーの作り方","md",null,{},"\u002Farticles\u002Flaravel-custom-faker",{"title":5,"description":538},"articles\u002Flaravel-custom-faker",[32,546],"laravel","_common\u002Flaravel.png","J5_Trsafdn5yWViWjr3IsUw74QmcNr3WsF_8_DUEepU",1780987143025]