[Larevel] Seederをより使いやすくする
LaravelではSeederを利用したデータの登録が用意されており、これをより使いやすくインタラクティブにする方法がとても良かったので紹介します。
ユーザーには3つの権限administrator
、writer
、reader
のいずれかに属するものとし、これをSeeder実行時に指定するサンプルです。
migrationの編集
Laravelインストール時に用意されているdatabases/migrations/2014_10_12_000000_ceate_users_table.php
を編集して利用します。
下記のように権限に関するrole
カラムを追加してください。
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->enum('role', ['administrator', 'writer', 'reader'])->default('reader');
$table->rememberToken();
$table->timestamps();
});
}
編集後にphp artisan migratoin
コマンドでマイグレーションを実行しておきましょう。
Userモデルの編集
作成したrole
カラムに関する処理を追加します。
// app/User.php
public function withRole($role)
{
$this->role = $role;
$this->save();
return $this;
}
Seederの作成
今回の肝の部分ですが、実行するSeeder
を作成しておきます。
php artisan make:seeder UserSeeder
Seeder created successfully.
作成したSeeder
を下記のように編集します。
<?php
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(\App\User::class)
->create()
->withRole($this->command->choice(
'What role is the user?', [
'administrator',
'writer',
'reader'
]
));
}
}
コマンドクラスのchoice
メソッドを利用して、withRole()
メソッドへ渡す引数の指定を可変に出来ます。
Seeder
コマンドを実行して動作を確認してみましょう。
php artisan db:seed --class=UserSeeder
What role is the user?:
[0] administrator
[1] writer
[2] reader
コンソール上に権限を指定するインターフェイスが表示されました。各種数字を入力することで、簡単に権限の付与が可能になります。