LaravelのBootstrapを使ったユーザー登録画面で、アバター画像用フィールドを追加する方法を解説します。
フォーラムサイトなど、ユーザーの画像があったほうが良いWebアプリで使えます。
ステップがたくさんあってやや面倒なのですが、ひとつずつ説明していきますね。
Laravel8でユーザー登録フォームにアバター画像を追加する方法
下記の手順ですすめていきます。
- Bootstrapで認証画面を作る
- Userテーブルにavatarカラムを追加
- Userモデルにavatarフィールドを追加
- RegisterコントローラーにAvatarを追加
- register.blade.phpにAvatarフィールドを追加
- テストする
- うまくいかない場合
Bootstrapで認証画面を作る
まずBoostrapで認証画面が必要です。
uiを組み込んだ後、bootstrapの認証機能を入れます。
1 |
composer require laravel/ui |
1 |
php artisan ui bootstrap --auth |
Laravelのインストール方法解説記事で詳しく紹介しているので、分かりにくければ、こちらも参考にしてください。
Userテーブルにavatarカラムを追加
既存のUserテーブルにAvatarカラムを追加します。
下記コマンドで、マイグレーションファイルを作成します。
1 |
php artisan make:migration add_column_avatar_to_user_table --table=users |
database/migrations の中にファイルができるので、下記のように編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function up() { Schema::table('users', function (Blueprint $table) { $table->string('avatar')->after('name'); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('avatar'); }); } |
avatar登録を【必須】ではなく【任意】にする場合は、->default を使って、default画像を設定しておくと良いですよ。
1 2 3 |
Schema::table('users', function (Blueprint $table) { $table->string('avatar')->default('user_default.jpg')->after('name'); }); |
ファイル編集後、マイグレートを実行します。
1 |
php artisan migrate |
Userモデルにavatarフィールドを追加
Userモデルファイルを開き、avatarフィールドもfillableに加えておきましょう。
これで、フォームから入力可能になります。
1 2 3 4 5 6 |
protected $fillable = [ 'name', 'avatar', 'email', 'password', ]; |
RegisterコントローラーにAvatarを追加
app/Http/Controllers/Authの中のRegisterController.phpを開きます。
50行目あたりの validatorに、avatarのバリデーションルールを加えておきましょう。
入力必須にするならrequired、画像形式のみ可能にするなら imageをいれます。
1 2 3 4 5 6 7 8 9 |
protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'avatar'=>['required', 'image'], 'password' => ['required', 'string', 'min:8', 'confirmed'], ]); } |
67行目あたりのcreateの処理は、次のようにいれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
protected function create(array $data) { $avatar=request()->file( 'avatar')->getClientOriginalName(); request()->file( 'avatar')->storeAs('public/images', $avatar); $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'avatar' => $avatar, 'password' => Hash::make($data['password']), ]); return $user; } |
コードの意味avatarフィールドの元々のファイル名をアバターの名前($avatar) とします。
avatarフィールドの画像をpublic/imagesに、$avatarという名前で保存します。
name, email, avatar, password フィールドの情報を使って、ユーザーを新規作成します。
getClientOriginalName()を使うと、アップロードしたファイルの元の名前を取ってこれます。
storeAs()は、ファイルに自分で名前を付けて保存ができるメソッドです。
引数は、次のように設定します。
register.blade.phpにAvatarフィールドを追加
次にユーザーに表示する部分を作ります。
resources/views/authの中のregister.blade.phpを編集します。
54行目あたりに下記を追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
<div class="form-group row"> <label for="avatar" class="col-md-4 col-form-label text-md-right">{{ __('プロフィール画像 (サイズは1024Kbyteまで)') }}</label> <div class="col-md-6"> <input id="avatar" type="file" name="avatar" class="@error('avatar') is-invalid @enderror"> @error('avatar') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> |
*また22行目のformタグには enctype="multipart/form-data" も入れておいてください。
1 |
<form method="POST" action="{{ route('register') }}" enctype="multipart/form-data"> |
追加:まだ画像保存をしたことがない場合
もしまだ画像を保存したことがない場合、最初にシンボリックリンクを貼っておきましょう。
Laravelでは画像はstorageフォルダに保存されますが、読み込むときはpublicフォルダを通じて読み込みます。
最初にstorageフォルダとpublicフォルダを結びつける設定が必要になります。
これがシンボリックリンクです。
次のコマンドを実行してください。
1 |
php artisan storage:link |
テストする
これで準備完了です。
実際にテストしてみましょう。
バリデーションでavatarを’required'(入力必須)にした場合、avatarを入れないと、エラーメッセージがでるはずです。
無事アップロードできると、storage/app/public/imagesフォルダの中に画像が保存されています。
データベースにもファイル名が登録されているはずなので、ご確認ください。
なおリンクをblade.phpファイルに挿入するときは、asset関数を使って、次のように記述します。
1 |
<img src="{{asset('storage/images/'.$user->avatar)}}" class="d-block rounded-circle mb-3"> |
うまくいかない場合
本記事ではわたし自身が実証済みの方法を紹介しております。
ただ、画像が思った場所に入ってくれないことがあるかもしれません。
わたしは何度か経験しました
うまくいかない場合には、RegisterControllerの画像ファイルを保存する設定を変更したり、
blade.phpファイルの画像ファイルのリンクを変えてみたりしてください。
ブラウザからソースコードもチェックしてみてください。
どう変えると良いか、ヒントが得られるかも。
「Laravelでの画像アップロード・保存機能が分かりにくい」と感じたら、こちらの記事も参考にしてくださいね。
画像付き投稿フォームの作り方を解説しています。