前回実装した退会機能に引き続き今回はパスワード変更機能を実装していこうと思います。
(退会機能の実装についてはこちらから)
【Laravel】論理削除を利用して退会機能を実装する
##使用環境
AWS Cloud9
Laravel 5.5.50
##実装する機能の内容
今回のパスワード変更機能はメール認証をしない仕様で実装します。
##コントローラーの作成
$ php artisan make:controller ChangePasswordController
##ルートの定義
//省略
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のアドレスでパスワードの変更画面を表示させる。
##コントローラーの編集
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()メソッドでつなぎます。
第1引数にキー、第2引数に値を入れます。
####フラッシュメッセージの表示
@if(session('warning'))
<div class="alert alert-danger">
{{ session('warning') }}
</div>
@endif
データはセッションを用いて表示されるのでsession()を使う。
statusを表示させるためにtop画面にも同様の追記。
##パスワード編集画面の実装
resources >> views >> password >> form
@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
##感想
・フラッシュメッセージを新しく知れてよかった。
・自分でバリデーションを実行することでバリデーションの流れについて学べた。
・難しいかと思ったが意外とシンプルだった。
・次回はメール認証でのパスワード変更にチャレンジする。