パスワード変更機能の実装

前回実装した退会機能に引き続き今回はパスワード変更機能を実装していこうと思います。
（退会機能の実装についてはこちらから）
[【Laravel】論理削除を利用して退会機能を実装する](https://qiita.com/179Bell/items/2bf6a58d9314f5f00eeb)
##使用環境
AWS Cloud９
Laravel 5.5.50

##実装する機能の内容
今回のパスワード変更機能はメール認証をしない仕様で実装します。

##コントローラーの作成

```
$ php artisan make:controller ChangePasswordController
```
##ルートの定義

```web.php
//省略
Route::group(['middleware'=>'auth'],function(){
//中略
        Route::get('/password/change','ChangePasswordController@edit')->name('password.form');
        Route::put('/password/change','ChangePasswordController@update')->name('password.change');
```
パスワードの変更についてはログイン認証をしたユーザーのみがアクセスできるようにする。
/password/changeのアドレスでパスワードの変更画面を表示させる。

##コントローラーの編集
```ChangePasswordController.php
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ChangePasswordController extends Controller
{
    public function edit()
    {
        return view('password.form');
    }
    
    protected function validator(array $data)
    {
        return Validator::make($data,[
            'new_password' => 'required|string|min:6|confirmed',
            ]);
    }
    
    public function update(Request $request)

        $user = \Auth::user();
        if(!password_verify($request->current_password,$user->password))
        {
            return redirect('/password/change')
                ->with('warning','パスワードが違います');
        }
        
        //新規パスワードの確認
        $this->validator($request->all())->validate();
        
        $user->password = bcrypt($request->new_password);
        $user->save();
        
        return redirect ('/')
            ->with('status','パスワードの変更が終了しました');
    }
}
```
editメソッドでパスワード変更画面（password.form）に飛ばします。
validatorファザードを使用してバリデーションをした値をupdateメソッドに返します。
updateメソッドではまず現在のパスワードをpassword_verifyを用いて確認、一致しないのであればエラーのフラッシュメッセージを返すよう記述。
その後新しく入力されたパスワードが要件を満たしているかを確認後保存されるように記述、成功したのであれば完了文をTOPページに表示させます。
今回はフラッシュメッセージを用いてエラーメッセージ等を出せるようにしていきます。
リダイレクト先でフラッシュメッセージを表示させるにはredirectメソッドにアロー演算子を用いてwith（）メソッドでつなぎます。
第１引数にキー、第２引数に値を入れます。

####フラッシュメッセージの表示

```form.php
    @if(session('warning'))
        <div class="alert alert-danger">
            {{ session('warning') }}
        </div>
    @endif
```
データはセッションを用いて表示されるのでsession()を使う。
statusを表示させるためにtop画面にも同様の追記。

![スクリーンショット 2021-05-10 17.14.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/5ee1216a-fda7-a86d-7cf4-13ffe2e0be29.png)
変更に成功した場合
![スクリーンショット 2021-05-10 17.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/73250cba-8b1f-dc25-dac4-7aaaf4dfcb3c.png)
以前のパスワードが一致しない場合

参考:[Laravel でフラッシュメッセージを表示する方法
](https://php-junkie.net/framework/laravel/flash-message/)

##パスワード編集画面の実装
resources >> views >> password >> form

```form.php
    
    @if(session('warning'))//エラー文を表示させる
        <div class="alert alert-danger">
            {{ session('warning') }}
        </div>
    @endif

     <div class="row mt-5 mb-5">
        <div class="col-sm-6 offset-sm-3">
            
            {!! Form::open(['route'=>'password.change','method'=>'put']) !!}
                <div class="form-group">
                    {!! Form::label('current_password','以前のパスワード') !!}
                    {!! Form::password('current_password',['class'=>'form-control']) !!}
                </div>
            
                <div class="form-group">
                    {!! Form::label('new_password','新しいパスワード') !!}
                    {!! Form::password('new_password',['class'=>'form-control']) !!}
                </div>
                
                <div class="form-group">
                    {!! Form::label('new_password_confirmation','パスワードの確認') !!}
                    {!! Form::password('new_password_confirmation',['class'=>'form-control']) !!}
                </div>
                
                {!! Form::submit('パスワードを変更する',['class'=>'btn btn btn-primary mt-2']) !!}
            {!! Form::close() !!}
            
        </div>
    </div>

    
    
@endsection
```

##感想
・フラッシュメッセージを新しく知れてよかった。
・自分でバリデーションを実行することでバリデーションの流れについて学べた。
・難しいかと思ったが意外とシンプルだった。
・次回はメール認証でのパスワード変更にチャレンジする。

##参考
[Laravel入門](https://rinsaka.com/laravel/u08-changepassword.html)
[Laravel公式 バリデーション](https://readouble.com/laravel/5.5/ja/validation.html)