🎃

Filamentでユーザー登録画面を拡張して、ユーザー登録完了メール送信する

2024/09/09に公開

とりあえず、Filamentでユーザー登録できるようにする。

その後、Filamentでユーザー登録すると、
メールアドレスが利用されている物かどうかをチェックする為にメールを送信できるようになってる。
普通はそれで正しいんだけど、
今回は登録されたメールアドレスに「登録したからねぇ~」ってメールを送信するだけにしたいので、
独自のnotificationでメールを送信するようにする。

とういう事をしていくよ!

とりあえず、登録画面を使えるようにする

app/Providers/Filament/AdminPanelProvider.php
use Filament\Panel;
public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->login() //ログイン
        ->registration() //ユーザー登録
}

これだけで、ユーザー登録画面は出来上がる。

登録画面を拡張する

独自の登録画面用classを作る

app/Filament/Pages/Auth/Register.php
<?php

namespace App\Filament\Pages\Auth;

use Filament\Forms\Form;
use Filament\Pages\Auth\Register as BaseRegister;
use Filament\Forms\Components;
use Filament\Actions\Action;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Validation\Rules\Password;
use Illuminate\Support\Facades\Hash;

use App\Models\MasterCountry;

class Register extends BaseRegister
{
    public function form(Form $form): Form
    {
        return $form
            ->columns(2)
            ->schema([
				//フォームコンポーネントを利用してフォームを作成
                Components\TextInput::make('sei')
                    ->label(__('auth.sei'))
                    ->required(),
                Components\TextInput::make('mei')
                    ->label(__('auth.mei'))
                    ->required(),
                Components\TextInput::make('email')
                    ->label(__('filament-panels::pages/auth/register.form.email.label'))
                    ->email()
                    ->required()
                    ->maxLength(255)
                    ->unique($this->getUserModel())
                    ->columnSpan('full'),
                Components\TextInput::make('password')
                    ->label(__('filament-panels::pages/auth/register.form.password.label'))
                    ->password()
                    ->revealable(filament()->arePasswordsRevealable())
                    ->required()
                    ->rule(Password::default())
                    ->dehydrateStateUsing(fn($state) => Hash::make($state))
                    ->same('passwordConfirmation')
                    ->validationAttribute(__('filament-panels::pages/auth/register.form.password.validation_attribute'))
                    ->columnSpan('full'),
                Components\TextInput::make('passwordConfirmation')
                    ->label(__('filament-panels::pages/auth/register.form.password_confirmation.label'))
                    ->password()
                    ->revealable(filament()->arePasswordsRevealable())
                    ->required()
                    ->dehydrated(false)
                    ->columnSpan('full'),
            ]);
    }

    //データの変換を行う
	//$data['name']に文字が無いと、管理画面側でエラーがでるので、
	//$data['name']に文字を入れる
    public function mutateFormDataBeforeRegister($data) : array
    {
        $data['name'] = $data['sei'] . ' ' . $data['mei'];
		//ユーザー登録したIPアドレスを保存しておく
        $data['register_ip'] = $_SERVER['REMOTE_ADDR'];
		//権限IDを登録 強制的に1
        $data['role_id'] = 1;
        return $data;
    }

filamentのオリジナルのRegister.phpは
vendor/filament/filament/src/Pages/Auth/Register.phpに有る。

AdminPanelProviderで独自クラスを渡す

app/Providers/Filament/AdminPanelProvider.php
use Filament\Panel;
//登録画面クラス
use App\Filament\Pages\Auth\Register;
public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->login() //ログイン
        ->registration(Register::class) //ユーザー登録
}

これだけで、こんな感じ

登録後にメール送信するようにする

上でも書いたけど、
Filament自体では、メールアドレス確認の為の通知は行うけど、
登録したよ~っていうメールを送信する機能は無い。
なので、laravelのNotificationsを利用して独自実装する。

まずはNofificationsClassを作成

vendor/bin/sail php artisan make:notification RegisterdNotification

これで、app/Notifications/RegisterdNotification.phpができるので、
メール送信するように編集する

app/Notifications/RegisterdNotification.php
	//編集した部分だけ
	public function toMail(object $notifiable): MailMessage
    {
        // dd(['msg'=>'RegisterdNotification:toMail','noti'=>$notifiable]);
        return (new MailMessage)
                    ->subject('〇〇システム ユーザー登録完了のお知らせ')
                    ->markdown('mail.register');
    }

Register.phpで作成したNotificationを利用する

app/Filament/Pages/Auth/Register.php
use App\Notifications\RegisterdNotification;

    //メール通知を行う
    //【メールアドレスが実際に利用されているかをチェックするものではない】
    //登録されたメールアドレスに登録された事を通知する
    protected function sendEmailVerificationNotification(Model $user): void
    {
        $notification = new RegisterdNotification($user);
        $user->notify($notification);
    }

これで、メールが飛んでくる。

超簡単!

GitHubで編集を提案

Discussion