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

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

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

#実装
View

```php: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(完成系)

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

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

ignoreメソッドを使うことで、ログインしているユーザーのID以外をバリデーションで引っかかるように設定できました！
[これはLaravel6.xの公式ドキュメントにも書いてあって便利！](https://readouble.com/laravel/6.x/ja/validation.html "laravel 6.x バリデーション")

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

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

```
php artisan storage:link
```

すると、publicディレクトリに…！！
![スクリーンショット 2021-12-12 22.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194008/c3d81a1e-1a89-b1f3-1ff2-9885a83785ff.png)
**爆★誕**

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

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

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

データベース(phpMyAdmin)でusersテーブルを見てみると…
![スクリーンショット 2021-12-12 22.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194008/c62efef4-1e7a-de85-db6b-dd96cb7c625d.png)
**あっ(察し)**
そう、DBにpublic/images/画像のURL で登録されているため、ブラウザ上ではpublic/images/storage/images/画像のURLを参照している＝表示されなかったのである。

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

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

これを

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

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

#まとめ
basenameメソッドは神