Laravelにユーザー作成コマンドを追加する

Laravelにユーザー作成コマンドを追加する

本日は、初期アカウントなどを作成するためのLaravelのArtisanコマンドの作成方法を紹介致します。

ユーザー作成用のArtisanコマンドがあると環境構築時にDBを直接触らずに済むので非常に便利です。

tinkerでもDBの操作はできますが、よく使用するものはArtisanコマンド化した方がラクかと思います。

実行環境

  • PHP ^8.0 | ^8.1
  • Laravel 9

注意事項

紹介するコードはLaravelのデフォルトのUserモデル及びusersテーブルを使用していることを前提としています。

Artisanコマンド作成

app/Console/Commands/CreateUserCommand.php

namespace App\Console\Commands;

use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Symfony\Component\Console\Exception\RuntimeException;

class CreateUserCommand extends Command
{
    protected $signature = 'user:create {--u|username= : User name of the newly created user.} {--e|email= : E-mail of the newly created user.} {--p|password= : Password of the newly created user.}';

    protected $description = 'Create a new user';

    /**
     * @var array{ email: string, password: string, name: string }
     */
    protected array $attributes = [
        'email' => 'info@example.com',
    ];

    protected string $defaultPassword = 'password';

    public function handle(): int
    {
        try {
            $this->promptEmail();
            $this->promptUsername();
            $this->promptPassword();

            $user = $this->createUser();

            $this->info('User created successfully.');
        } catch (RuntimeException $e) {
            $this->error($e->getMessage());

            return 1;
        }

        return 0;
    }

    protected function promptEmail(): static
    {
        $email = $this->option('email');

        if ($email === null) {
            $email = $this->ask('What is an E-mail?', $this->attributes['email']);
        }

        $validator = Validator::make([
            'email' => $email,
        ], [
            'email' => ['required', 'email', 'unique:users,email'],
        ]);

        if ($validator->fails()) {
            throw new RuntimeException($validator->errors()->first());
        }

        $this->attributes['email'] = $email;

        return $this;
    }

    protected function promptUsername(): static
    {
        $name = $this->option('username');

        if ($name === null) {
            $name = $this->ask('What is a name?', $this->attributes['name'] ?? $this->attributes['email']);
        }

        $this->attributes['name'] = $name;

        return $this;
    }

    protected function promptPassword(): static
    {
        $password = $this->option('password');

        if ($password === null) {
            $password = $this->secret(sprintf('What is a password? [%s]', $this->defaultPassword))
                ?? $this->defaultPassword;
        }

        $this->attributes['password'] = Hash::make($password);

        return $this;
    }

    protected function createUser(): User
    {
        /** @var User $user */
        $user = User::query()->create($this->attributes);

        return $user;
    }
}

app/Console/Kernel.phpに登録したコマンドを登録。

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        \App\Console\Commands\CreateUserCommand::class,
    ];

    // ...
}

コマンド確認

listコマンドで登録したartisanコマンドが登録されているか確認することができます。

$ php artisan list
 ...
 user
  user:create                  Create a new user

コマンド実行

対話型でユーザー登録。

$ php artisan user:create
 What is an E-mail? [info@example.com]:
 > admin@example.com

ユーザー情報を引数で指定することも可能です。

$ php artisan user:create -u admin -e admin@example.com

おわりに

READMEにアカウント作成コマンドが記載されているとローカル環境の構築がスムーズにできるのでおすすめです。