0
3

More than 1 year has passed since last update.

Laravel6.xでプロフィールの更新画面を作りたい!【シンボリックリンク】

Posted at

やっていること

Laravel6.2を使ってツイッターのクローンサイトを製作中です。
自分への備忘録。MAMP環境で構築しています。

やりたいこと

今回はログインしているユーザーのプロフィールの編集画面を作りました。
編集画面に入ると、ユーザーネーム・メールアドレス・パスワード(変更する場合は変更後のパスワード、変更しない場合は今のパスワードを入力)・自己紹介・アイコンの編集ができるようにしたいです。

実装

View

profile.blade.php
<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(完成系)

UsersController.php
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テーブルに登録されているメールアドレスすべて=ログインしているユーザーのメールアドレスも引っかかってしまいます。
これではメールアドレスを変更せずに更新するときは不便です。

UsersController.php
 Rule::unique('users')->ignore(Auth::id())

ignoreメソッドを使うことで、ログインしているユーザーのID以外をバリデーションで引っかかるように設定できました!
これはLaravel6.xの公式ドキュメントにも書いてあって便利!

シンボリックリンク

シンボリックリンクは主に画像登録のときに使います。
「シンボリックリンク Laravel プロフィール」とかで検索すると死ぬほど出てきます。
シンボリックリンクを使用することで、storageディレクトリにアクセスできるようになり、ユーザーが編集のときにアップロードしたアイコンが保存できるようになるんですね〜〜!便利〜〜!

シンボリックリンクは以下コマンドで簡単に設定できます。

php artisan storage:link

すると、publicディレクトリに…!!
スクリーンショット 2021-12-12 22.39.34.png
爆★誕

画像が保存されるか試しますが、表示されません。ここでかなり詰まりました。

UsersController.php
$image = $request->file('iconimage')->store('public/images');

ここでstorageディレクトリの中にimagesフォルダが爆誕し、画像が保存されていきます。
ただ、画像が保存されません。

データベース(phpMyAdmin)でusersテーブルを見てみると…
スクリーンショット 2021-12-12 22.44.20.png
あっ(察し)
そう、DBにpublic/images/画像のURL で登録されているため、ブラウザ上ではpublic/images/storage/images/画像のURLを参照している=表示されなかったのである。

そこで使うものが、basenameメソッド。
basenameメソッドを使うことで、public/images/を除いた画像をDBにぶちこんでくれます!便利!

UsersController.php
'images' => input($images),

これを

UsersController.php
'images' => basename($image),

これに戻すことで無事に画像の更新ができました!

まとめ

basenameメソッドは神

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3