やっていること
Laravel6.2を使ってツイッターのクローンサイトを製作中です。
自分への備忘録。MAMP環境で構築しています。
やりたいこと
今回はログインしているユーザーのプロフィールの編集画面を作りました。
編集画面に入ると、ユーザーネーム・メールアドレス・パスワード(変更する場合は変更後のパスワード、変更しない場合は今のパスワードを入力)・自己紹介・アイコンの編集ができるようにしたいです。
実装
View
<img src="{{ asset('storage/images/' .auth()->user()->images) }}">
<form action="{{ url('profileup') }}" enctype="multipart/form-data" method="post">
@csrf
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<dl class="UserProfile">
<dt>username</dt>
<dd><input type="text" name="username" value="{{ Auth::user()->username }}"></dd>
<dt>mail address</dt>
<dd><input type="text" name="mail" value="{{ Auth::user()->mail }}"></dd>
<dt>password</dt>
<dd><input type="password" name="newpassword"></dd>
<dt>password confirm</dt>
<dd><input type="password" name="newpassword_confirmation"></dd>
<dt>bio</dt>
<dd><input type="text" name="bio" value="{{ Auth::user()->bio }}"></dd>
<dt>icon image</dt>
<dd><input type="file" name="iconimage"></dd>
</dl>
<input type="submit" name="profileupdate" value="こうしん">
</form>
バリデーションに引っかかるとエラーが出るように設定しています。
また、プロフィール編集画面にアクセスした段階でログインしているユーザーの名前・メールアドレス・自己紹介文・アイコンは表示されるよう書いています。
Controller(完成系)
public function profileupdate(Request $request){
$validator = Validator::make($request->all(),[
'username' => 'required|min:2|max:12',
'mail' => ['required', 'min:5', 'max:40', 'email', Rule::unique('users')->ignore(Auth::id())],
'newpassword' => 'min:8|max:20|confirmed|alpha_num',
'newpassword_confirmation' => 'min:8|max:20|alpha_num',
'bio' => 'max:150',
'iconimage' => 'image',
]);
$user = Auth::user();
//画像登録
$image = $request->file('iconimage')->store('public/images');
$validator->validate();
$user->update([
'username' => $request->input('username'),
'mail' => $request->input('mail'),
'password' => bcrypt($request->input('newpassword')),
'bio' => $request->input('bio'),
'images' => basename($image),
]);
return redirect('/profile');
}
わたしはControllerに編集の処理をすべて書きました。
一つずつ解説していきます😇
バリデーション
メールアドレスのバリデーションで、"DBに登録済みのメールアドレスはバリデーションで引っかかる"ように設定したい。
でも、unique('users')にするとusersテーブルに登録されているメールアドレスすべて=ログインしているユーザーのメールアドレスも引っかかってしまいます。
これではメールアドレスを変更せずに更新するときは不便です。
Rule::unique('users')->ignore(Auth::id())
ignoreメソッドを使うことで、ログインしているユーザーのID以外をバリデーションで引っかかるように設定できました!
これはLaravel6.xの公式ドキュメントにも書いてあって便利!
シンボリックリンク
シンボリックリンクは主に画像登録のときに使います。
「シンボリックリンク Laravel プロフィール」とかで検索すると死ぬほど出てきます。
シンボリックリンクを使用することで、storageディレクトリにアクセスできるようになり、ユーザーが編集のときにアップロードしたアイコンが保存できるようになるんですね〜〜!便利〜〜!
シンボリックリンクは以下コマンドで簡単に設定できます。
php artisan storage:link
画像が保存されるか試しますが、表示されません。ここでかなり詰まりました。
$image = $request->file('iconimage')->store('public/images');
ここでstorageディレクトリの中にimagesフォルダが爆誕し、画像が保存されていきます。
ただ、画像が保存されません。
データベース(phpMyAdmin)でusersテーブルを見てみると…
あっ(察し)
そう、DBにpublic/images/画像のURL で登録されているため、ブラウザ上ではpublic/images/storage/images/画像のURLを参照している=表示されなかったのである。
そこで使うものが、basenameメソッド。
basenameメソッドを使うことで、public/images/を除いた画像をDBにぶちこんでくれます!便利!
'images' => input($images),
これを
'images' => basename($image),
これに戻すことで無事に画像の更新ができました!
まとめ
basenameメソッドは神