あらすじ
Laravel Breezeでユーザー情報の項目を追加する場合、以下の変更を行う必要があるようです。
- テーブル
- モデル
- コントローラ
- ビュー
- リクエスト
- 言語
環境
Windows10
PHP 8.2.4
Laravel 9.52.9
電話番号を追加
例として電話番号を任意項目で追加する状況とします
[テーブル] usersテーブルに項目を追加
マイグレーションファイルを作成します。
$ php artisan make:migration add_phone_number_field_to_users_table
phone_numberカラムを追加します。
文字数最大13文字でNull許容にしています。
database\migrations****_**_**_******_add_phone_number_field_to_users_table.php
return new class extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
- //
+ $table->string('phone_number', 13)->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
- //
+ Schema::dropColumn('phone_number');
}
}
};
マイグレーションしてテーブルに反映させます。
$ php artisan migrate
[モデル] Userモデルの$filableに項目を追加
モデルが追加した項目を扱えるようにします。
app\Models\User.php
class User extends Authenticatable
{
...
protected $fillable = [
'name',
+ 'phone_number',
'email',
'password',
];
...
}
[コントローラ] RegisteredUserControllerに項目を追加
DBに登録するようにstoreメソッドへ追記します。
app\Http\Controllers\Auth\RegisteredUserController.php
class RegisteredUserController extends Controller
{
...
public function store(Request $request): RedirectResponse
{
$request->validate([
'name' => ['required', 'string', 'max:255'],
+ 'phone_number' => ['string', 'max:13'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$user = User::create([
'name' => $request->name,
+ 'phone_number' => $request->phone_number,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
event(new Registered($user));
Auth::login($user);
return redirect(RouteServiceProvider::HOME);
}
}
[ビュー] 画面にフィールドを追加
登録画面のregister.blade.phpと編集画面のupdate-profile-information-form.blade.phpにフィールドを追加します。
typeがtelで最大13文字にしています。また、入れてほしい形式をプレースホルダーで表示させています。
resources\views\auth\register.blade.php
<x-guest-layout>
<form method="POST" action="{{ route('register') }}">
@csrf
...
+ <!-- Phone Number -->
+ <div class="mt-4">
+ <x-input-label for="phone_number" :value="__('電話番号')" />
+ <x-text-input id="phone_number" name="phone_number" type="tel" maxlength="13" placeholder="080-XXXX-XXXX" class="block mt-1 w-full" :value="old('phone_number')" autocomplete="phone_number" />
+ <x-input-error :messages="$errors->get('phone_number')" class="mt-2" />
+ </div>
...
</form>
</x-guest-layout>
...
resources\views\profile\partials\update-profile-information-form.blade.php
<section>
...
<form method="post" action="{{ route('profile.update') }}" class="mt-6 space-y-6">
@csrf
@method('patch')
...
+ <div>
+ <x-input-label for="phone_number" :value="'__('電話番号')'" />
+ <x-text-input id="phone_number" name="phone_number" type="tel" maxlength="13" placeholder="080-XXXX-XXXX" class="mt-1 block w-full" :value="old('phone_number', $user->phone_number)" autocomplete="phone_number" />
+ <x-input-error class="mt-2" :messages="$errors->get('phone_number')" />
+ </div>
...
</form>
</section>
[リクエスト] ProfileUpdateRequestに項目を追加
これがないと変更時に更新されなくなります。
Null許容かつ正規表現で入力チェックしています。
app\Http\Requests\ProfileUpdateRequest.php
class ProfileUpdateRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => ['string', 'max:255'],
+ 'phone_number' => ['nullable', 'string', 'max:13', 'regex:/^0[-\d]{11,12}$/u'],
'email' => ['email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)],
];
}
}
[言語] varidation.phpのattributesに日本語名を追記
バリデーション時に参照される項目名を追記します。
lang\ja\validation.php
<?php
return [
...
'attributes' => [
...
+ 'phone_number' => '電話番号',
],
];