User Tableのカスタマイズ

USER Tableは最初から用意されている特別なテーブルで、JetStreamで認証機能を実現していることもあり、特別な仕様となっているので難物。

住所項目を追加してみる。

migrationの修正

database/migration/20141012000000createuserstable.php

        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->foreignId('current_team_id')->nullable();
            $table->string('profile_photo_path', 2048)->nullable();
            $table->string('addr01');
            $table->timestamps();
        });

php artisan migrate:fresh

登録Bladeの修正

入力欄を設ける。(ルーディングを追わないとこのファイルだとわからない)

\resources\views\auth\register.blade.php

        <div class="mt-4">
            <x-jet-label for="addr01" value="{{ __('addr01') }}" />
            <x-jet-input id="addr01" class="block mt-1 w-full" type="text" name="addr01" required autocomplete="addr01" />
        </div>

Validationなど

\app\Actions\Fortify\CreateNewUser.php

    public function create(array $input)
    {
        Validator::make($input, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => $this->passwordRules(),
            'addr01' => ['required', 'string', 'max:255'],
            'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '',
        ])->validate();

        return User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'password' => Hash::make($input['password']),
            'addr01' => $input['addr01'],
        ]);
    }

Model

\app\Models\User.php

protected $fillable = [
    'name',
    'email',
    'password',
    'addr01',
];

これで登録は可能となる。

Profileでの修正

\resources\views\profile\show.blade.php
           @if (Laravel\Fortify\Features::canUpdateProfileInformation())

とあるので、Fortify\FeaturesのcanUpdateProfileInformationを調べる。

    public static function canUpdateProfileInformation()
    {
        return static::enabled(static::updateProfileInformation());
    }

とあるので、\resources\views\profile\update-profile-information-form.blade.phpを修正。

入力欄を追加する。

        <div class="col-span-6 sm:col-span-4">
            <x-jet-label for="addr01" value="{{ __('addr01') }}" />
            <x-jet-input id="addr01" type="text" class="mt-1 block w-full" wire:model.defer="state.addr01" autocomplete="addr01" />
            <x-jet-input-error for="name" class="mt-2" />
        </div>

修正登録を有効にするには、<x-jet-form-section submit="updateProfileInformation">とあるので、

\app\Actions\Fortify\UpdateUserProfileInformation.php

    public function update($user, array $input)
    {
        Validator::make($input, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
            'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'],
            'addr01' => ['required', 'string', 'max:255'],
        ])->validateWithBag('updateProfileInformation');

        if (isset($input['photo'])) {
            $user->updateProfilePhoto($input['photo']);
        }

        if ($input['email'] !== $user->email &&
            $user instanceof MustVerifyEmail) {
            $this->updateVerifiedUser($user, $input);
        } else {
            $user->forceFill([
                'name' => $input['name'],
                'email' => $input['email'],
                'addr01' => $input['addr01'],
            ])->save();
        }
    }

    /**
     * Update the given verified user's profile information.
     *
     * @param  mixed  $user
     * @param  array  $input
     * @return void
     */
    protected function updateVerifiedUser($user, array $input)
    {
        $user->forceFill([
            'name' => $input['name'],
            'email' => $input['email'],
            'email_verified_at' => null,
            'addr01' => $input['addr01'],
        ])->save();

        $user->sendEmailVerificationNotification();
    }

追加

項目を追加してregist時に登録することはできた。
しかしながら、ロッカー設置場所の選択や、支払方法の選択など、データベース登録項目からドロップダウンで選択するにはどうすればよいのか?

Controllerからコレクションを渡す必要があるが、どこにあるのか?

Fortify.php内の

public static function registerView($view)
    {
        app()->singleton(RegisterViewResponse::class, function () use ($view) {
            return new SimpleViewResponse($view);
        });
    }

ここをいじってもダメ。

singletonで作成されるインスタンス SimpleViewResponse($view);を攻めないといけない。

\vendor\laravel\fortify\src\Http\Responses\SimpleViewResponse.php

がターゲットとなる。

use App\Models\Payment; など追加して、

registのみ対象にするので、

public function toResponse($request)
    {
        if (! is_callable($this->view) || is_string($this->view)) {
            if( $this->view =='auth.register'){
                $items = Payment::all();
                return view($this->view, ['request' => $request, 'items' => $items]);
            }else{
                return view($this->view, ['request' => $request]);
            }
        }

        $response = call_user_func($this->view, $request);

        if ($response instanceof Responsable) {
            return $response->toResponse($request);
        }
        return $response;
    }

邪道かもしれない。