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;
}
邪道かもしれない。