＜設計＞ユーザ退会機能

概要
-
【PHP/Laravel】プログラミング初学者によるアプリケーション開発
https://qiita.com/AlpacaFace/items/b8e05a3da599815d8e31

上記トークアプリ開発の設計を説明します。

対象機能
-
- ユーザ退会機能
- 追加機能：フラッシュメッセージ機能の実装（ユーザ情報更新時、ユーザ退会時）

基本設計
-
*** 【定義】　***
- ユーザ退会機能とは、登録済みのログインユーザ自身がトークアプリから退会する機能。

*** 【仕様】　***
- 退会ボタンは、ユーザ情報を編集する画面から表示させる。
- 退会処理は、退会ボタンからのみ可能。
- 退会ボタンにはルーティングの住所が存在しない。

*** 【画面遷移】　***
- 退会ボタンを一度押した時、「本当に退会しますか？」のメッセージが表示される。
- メッセージの下には「退会する」　「閉じる」　のボタンが表示される。
- 「閉じる」　を押すと、ユーザ情報の編集画面に戻る。
- 「退会する」を押すと、トップページに画面遷移する。退会後のトップページには自分の名前と、自分の名前に紐づいた投稿が全て削除されている。


*** 【再登録時の仕様】　***
- 再び、同じユーザが新規登録しようとすると、メールアドレスが以前使用していたものが、既に使われていることになっており、使えない。
- ユーザ名やパスワードは同じものが使える。


*** 【操作権限】　***

＜まとめ＞ユーザ退会ボタン操作
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292958/d2a1d99c-2b54-25ae-cb21-c42c08a22aa5.png)



詳細設計
-

*** 【論理削除と物理削除】　***
- 物理削除を採用。
- 外部キー制約を利用してユーザに紐づいた投稿も削除されるようにする。

*** 【Router】 ***
- routes/web.php



        （中略）

        // ログイン後
        Route::group (['middleware' => 'auth'], function () {
            （中略）
            // ユーザ情報編集
            Route::prefix('users')->group(function () {
                （中略）
                Route::delete('{id}', 'UsersController@destroy')->name('users.delete');
            });


*** 【Controller】 ***
- app/Http/Controllers/UsersController.php

- ユーザ情報更新機能とフラッシュメッセージ機能

      （中略）
        protected function store(UserRequest $request, $id)
        {
            $user = User::findOrFail($id);
            if (\Auth::id() === $user->id) {
                $user->name = $request->name;
                $user->email = $request->email;
                $user->password = bcrypt($request->password);
                $user->save();
                $user_info_edit = [];
                if ($user_info_edit) {
                    $user_info_edit_messageKey = 'infoedit_errorMessage';
                    $user_info_edit_flashMessage = __('flshmsg_user_info.edit_faild');
                } else {
                    $user_info_edit_messageKey = 'infoedit_successMessage';
                    $user_info_edit_flashMessage = __('flshmsg_user_info.edit_success');
                }
                return redirect("/")->with($user_info_edit_messageKey, $user_info_edit_flashMessage);
            }
            return App::abort(404);
        }



- ユーザ退会機能とフラッシュメッセージ機能

        （中略）
            public function destroy($id)
            {
                $user = User::findOrFail($id);
                if (\Auth::id() === $user->id) {
                    $user->delete();
                    $userquit = [];
                    if ($userquit) {
                        $messageKey = 'quit_errorMessage';
                        $flashMessage = __('flshmsg_user_info.quit_faild');
                    } else {
                        $messageKey = 'quit_successMessage';
                        $flashMessage = __('flshmsg_user_info.quit_success');
                    }
                    return redirect("/")->with($messageKey, $flashMessage);
                }
                return App::abort(404);
            }



*** 【flash message】***
- resources/lang/ja/flshmsg_user_info.php

        <?php
        
        // ユーザ情報編集画面のフラッシュメッセージ
        return [
          // ユーザ情報編集_成功
          'edit_success' => 'ユーザ情報が更新されました',
          // ユーザ情報編集_失敗
          'edit_faild' => 'ユーザ情報の更新に失敗しました',
          // ユーザ退会_成功
          'quit_success' => '退会が完了しました',
          // ユーザ退会_失敗
          'quit_faild' => '退会処理に失敗しました',
        ];



*** 【View】 ***
- resources/views/users/FlashMessages.blade.php

        <!-- ユーザ情報編集 -->
        <!-- 成功 -->
        @if (session('infoedit_successMessage'))
            <div class="alert alert-success text-center w-50 mx-auto mb-3">
                {{ session('infoedit_successMessage') }}
            </div> 
        @endif
        <!-- 失敗 -->
        @if (session('infoedit_errorMessage'))
            <div class="alert alert-danger text-center w-50 mx-auto mb-3">
                {{ session('infoedit_errorMessage') }}
            </div> 
        @endif
        
        <!-- ユーザ退会処理 -->
        <!-- 成功 -->
        @if (session('quit_successMessage'))
            <div class="alert alert-danger text-center w-50 mx-auto mb-3">
                {{ session('quit_successMessage') }}
            </div> 
        @endif
        <!-- 失敗 -->
        @if (session('quit_errorMessage'))
            <div class="alert alert-danger text-center w-50 mx-auto mb-3">
                {{ session('quit_errorMessage') }}
            </div> 
        @endif


動作確認テスト
-

- ユーザ情報を編集する
![ユーザ情報を編集する.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292958/5e0f413c-6871-82cb-a85b-7df87f923048.jpeg)

![ユーザ情報を編集後フラッシュメッセージ表示.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292958/66bca9b9-f758-f36b-113a-83031c83bb20.jpeg)

- ユーザ退会
![退会する.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292958/53b12d21-779f-3d90-cf01-4f9c176730ae.jpeg)

![本当に退会しますか.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292958/965f9202-56f1-40ff-9af5-93a1eb79d6c9.jpeg)

![退会完了後フラッシュメッセージ表示.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292958/b5a1d364-a743-cb00-0c8e-fccf7803c685.jpeg)