シーダ(初期値設定)クラスを使用し、テストデーターをデーターベースに設定するシンプルな方法もLaravelには備わっています。全シーダクラスはdatabase/seedsに保存します。シーダクラスには好きな名前を付けられます。しかしUsersTableSeederなどのような分かりやすい規則に従ったほうが良いでしょう。デフォルトとしてDatabaseSeederクラスが定義されています。このクラスからcallメソッドを使い他の初期値設定クラスを呼び出すことで、シーディングの順番をコントロールできます。
データベース:シーディング 6.x Laravel
上記にある通り、シーダはLaravelに備わっているデータベースに値をまとめて投入するための仕組みです。大体 /database/seeder 以下にまとめて作られます。このシーダの処理中にプログレスバーを表示する方法を紹介します。実装は次で
<?php use Illuminate\Database\Seeder; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Output\ConsoleOutput; abstract class BaseSeeder extends Seeder { /** * シーダーとして走るコード */ abstract public function run(): void; /** * 色々情報の詰まったフォーマットに改造したプログレスバーを生成して返す。 * @param int $max * @return ProgressBar */ protected function createProgressBar($max = 0): ProgressBar { $progressBar = new ProgressBar(new ConsoleOutput(), $max); $progressBar->setFormat('%current%/%max% [%bar%] %percent%% %elapsed:6s%/%estimated:-6s% %memory:6s%'); $progressBar->setEmptyBarCharacter(' '); $progressBar->setBarCharacter('='); $progressBar->setProgressCharacter('>'); return $progressBar; } /** * 現在カーソルのある行をまっさらにする。 */ protected function clearLine(): void { echo "\033[2K\r"; } }
次の様に使います。
<?php use App\Models\Eloquents\User; class UserSeeder extends BaseSeeder { /** * Run the database seeds. * * @return void */ public function run(): void { $dataCount = 200; // プログレスバーを用意する $bar = $this->createProgressBar($dataCount); factory(User::class, $dataCount)->make()->each( static function (User $user) use ($bar) { // Userに関するいろいろなデータの保存処理 $user->save(); // Userに関するいろいろなデータの保存処理 $bar->advance();// プログレスバーを進める } ); $bar->finish();// プログレスバーを終了 $this->clearLine();// 行をきれいにしないと次の表示が壊れる } }
親クラス BaseSeeder にプログレスバーを用意する関数とプログレスバーをなかったことにする関数を用意し、子クラスの各シーダで呼びます。オートローディングの都合で trait は使うのが面倒なので親クラスに共通メソッドを置くパターン実装しています。プログレスバーを用意したら、通常の処理に加えてプログレスバーの開始、進行、終了を記述します。
プログレスバーは以前紹介したコンソールのものをそのまま呼び出しています。
【Laravel】Artisanでプログレスバーを自在に作る – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発
この例ではプログレスバーのみですが次のリンク先にある Console Component も同様に使えます。
The Console Component (Symfony Docs)