0.背景
本記事は、記事「実務未経験状態でLaravelを使用した共同開発」で取り組んだタスクのうち、ユーザ退会機能についてまとめたもの
1.仕様内容
・ユーザ編集画面(他メンバーが作成した画面)へ退会ボタンを追加
・クリックで確認モーダルを表示
・モーダル内の「退会」ボタンでユーザー削除(SoftDelete)
・退会時、対象ユーザの投稿も削除
UI※デプロイしたもの
2.タスクの見積もり
期間
・7日
理由
・ユーザー編集画面は他メンバーが実装中であり、着手に遅れが出る可能性があったため
・実装中のエラー対応やレビュー期間も考慮
実績
・仕様作成完了 4日
・PR完了 4日
・PRレビュー後修正5日
・マージ完了 6日
3.実装
①Routing
・web.php
・認証済みユーザーのみ処理可能にするため、auth ミドルウェアを適用
Route::group(['middleware' => 'auth'], function () {
・ユーザー関連処理をまとめるため、/users プレフィックスを使用
Route::prefix('/users')->group(function(){
Route::delete('/{id}', 'User\UsersController@destroy')->name('users.destroy'); // ユーザ削除
②Model
・User.phpに記載
・退会時にそのユーザーの投稿も一緒に削除(boot メソッドをオーバーライド)
protected static function boot()
{
parent::boot();
static::deleting(function($user){
$user->posts()->delete();
});
}
・SoftDelete の有効化
protected $dates = ['deleted_at'];
③Controller
・UsersController:destroyメソッド
・本人確認(ログインユーザーと対象ユーザーが一致するか)
・ユーザを削除、ログアウト処理
・ログアウト処理、セッション無効化、CSRFトークン再生成
・トップページへリダイレクト
public function destroy($id, Request $request)
{
$user = User::findOrFail($id);
if(Auth::id() !== $user->id){
abort(403,'権限がありません。');
}
$user->delete();
Auth::logout();
$request->session()->invalidate(); // session無効化
$request->session()->regenerateToken(); // CSRFトークンをリセット
return redirect('/'); // 退会後トップページへ
}
④View
・users/edit.blade.php内に記載
・退会ボタン(モーダル起動)
<a class="btn btn-danger text-light" data-toggle="modal" data-target="#deleteConfirmModal">退会する</a>
・退会モーダル
<div class="modal fade" id="deleteConfirmModal" tabindex="-1" role="dialog" aria-labelledby="basicModal" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4>確認</h4>
</div>
<div class="modal-body">
<label>本当に退会しますか?</label>
</div>
<div class="modal-footer d-flex justify-content-between">
<form action="{{ route('users.destroy', ['id' => $user->id]) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">退会する</button>
</form>
<button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
</div>
</div>
</div>
</div>
4.テスト実施
・ユーザログイン状態でのみボタン表示を確認
・ユーザの退会処理動作を確認
・退会時、投稿の削除も確認(softDelete)
5.PRレビュー
・ルーティング記載の仕様間違い
→今回の退会ボタンは他画面で使う予定がなかったためコンポーネント化しなかったが、将来的な再利用も視野に入れた実装が望ましかったかもしれない
→ログインしていなければボタン表示すらしないから良いと誤った判断
6.本実装に関して
・再利用性:退会ボタンに関して他ページでは使用することがないため、カプセル化しなかったがしてもよかったのではないか
・実装前の仕様確認漏れが原因で修正が発生したため、今後はチェックリストを使って確認精度を高める