'required | email']; $message = [ 'email.required' => 'メールアドレスを入力してください', 'email.email' => 'メールアドレスの形式が正しくありません' ]; $validator = Validator::make($request->all(), $rules, $message); if ($validator->fails()) { return redirect("{$management_code}/member_regist") ->withErrors($validator) ->withInput(); } // 登録済メールアドレスチェック $email = $request->input('email'); $existingMember = User::where('user_primemail', $email)->get(); foreach ($existingMember as $member) { if ($member->user_quit_flag != 1) { return redirect("{$management_code}/member_regist") ->withErrors(['email' => '指定のメールアドレスは既に使用されています。']) ->withInput(); } } // 会員登録用暗号化URL生成(有効期限30分) $url = URL::temporarySignedRoute('member_regist_input', now()->addMinutes(30), ['management_code' => $management_code, 'email' => encrypt($email)]); // メール送信 Mail::send(["text" => 'emails.member_regist_info'], ['url' => $url], function ($message) use ($email) { $message->to($email)->subject('【So-Manager】新規ユーザー登録用URLのご案内'); }); // 完了画面遷移 return view('general.member_regist_send_mail'); } // メールのURLからアクセス public function index($management_code) { // 署名付きURLの有効期限チェック if (!request()->hasValidSignature()) { return redirect("{$management_code}/error")->withErrors(['error' => '署名の有効期限が切れています']); } // パラメータ存在チェック $encryptedEmail = request()->query('email'); if (!$encryptedEmail) { return redirect("{$management_code}/error")->withErrors(['error' => 'メールアドレスが指定されていません']); } // パラメータ整合性チェック try { $email = decrypt($encryptedEmail); } catch (\Exception $e) { return redirect("{$management_code}/error")->withErrors(['error' => 'メールアドレスの情報が不正です']); } // 二重登録防止チェック $existingMember = User::where('user_primemail', $email)->get(); foreach ($existingMember as $member) { if ($member->user_quit_flag != 1) { return redirect("{$management_code}/error")->withErrors(['error' => '既に登録済みです']); } } // メールアドレスをセッションに保存 session(['email' => $email]); // 入力画面に遷移 return view('general.member_regist_input', ['management_code' => $management_code]); } // リダイレクト用 public function indexBack(Request $request, $management_code) { if (!session('email')) { return redirect("{$management_code}/error")->withErrors(['error' => '不正なアクセスです']); } // 入力画面に遷移 return view('general.member_regist_input', ['management_code' => $management_code]); } // 確認画面表示 public function confirm(Request $request, $management_code) { // 登録完了後のブラウザバックによる二重登録対策 if (!session()->has('email')) { return redirect("{$management_code}/error")->withErrors(['error' => '不正なアクセスです']); } // 入力チェック内容 (メールアドレスはセッションから取得するため対象外) $rules = [ 'name' => 'required', 'kana' => 'required|regex:/^[ァ-ヶー]+$/u', 'phone' => [ 'nullable', function ($attribute, $value, $fail) use ($request) { $phone = $request->input('phone'); $mobile = $request->input('mobile'); // 電話番号が部分的に入力されている場合はエラー if (is_array($phone) && !empty(array_filter($phone))) { $filtered = array_filter($phone); if (count($filtered) != count($phone)) { $fail('自宅電話番号は全ての項目を入力してください'); } } }, ], 'mobile' => [ 'nullable', function ($attribute, $value, $fail) use ($request) { $phone = $request->input('phone'); $mobile = $request->input('mobile'); // どちらも未入力の場合はエラー $phoneEmpty = is_array($phone) ? empty(array_filter($phone)) : empty($phone); $mobileEmpty = is_array($mobile) ? empty(array_filter($mobile)) : empty($mobile); if ($phoneEmpty && $mobileEmpty) { $fail('電話番号はどちらかの入力が必須です'); } // 携帯電話番号が部分的に入力されている場合はエラー if (is_array($mobile) && !empty(array_filter($mobile))) { $filtered = array_filter($mobile); if (count($filtered) != count($mobile)) { $fail('携帯電話番号は全ての項目を入力してください'); } } }, ], 'birthdate' => 'required|date', ]; // エラーメッセージ (メールアドレスはセッションから取得するため対象外) $message = [ 'name.required' => '名前を入力してください', 'kana.required' => 'フリガナを入力してください', 'kana.regex' => 'フリガナは全角カタカナで入力してください', 'birthdate.required' => '生年月日を入力してください', 'birthdate.date' => '生年月日を正しく入力してください', ]; // バリデーションチェック $validator = Validator::make($request->all(), $rules, $message); if ($validator->fails()) { return redirect("{$management_code}/member_regist_input_back")->withErrors($validator)->withInput(); } // 画面返却値 $input_data = [ "name" => $request->input('name'), "kana" => $request->input('kana'), "phone" => $request->input('phone'), "mobile" => $request->input('mobile'), "birthdate" => $request->input('birthdate'), "email" => session('email'), ]; // 確認画面に遷移 return view('general.member_regist_confirm', ['input_data' => $input_data, 'management_code' => $management_code]); } // 会員登録 or 戻る public function complete(Request $request, $management_code) { // 前の画面に戻る if($request->input('submit') == 'back'){ return redirect("{$management_code}/member_regist_input_back")->withInput(); } // 登録完了後のブラウザバックによる二重登録対策 if (!session()->has('email')) { return redirect("{$management_code}/error")->withErrors(['error' => '不正なアクセスです']); } // 利用者連番、利用者ID(利用者連番+7DSRチェックデジット)、初期パスワード(ハッシュ化)を生成 $commonFunction = new CommonFunction(); $nextSeq = \DB::table('user')->max('user_seq') + 1; $userId = $nextSeq . $commonFunction->calc7dsr($nextSeq); $userPass = $commonFunction->createPassword(); $userPassHash = $commonFunction->hashPassword($nextSeq, $userPass); // 会員情報登録 $user = new User(); $user->user_seq = $nextSeq; $user->user_id = $userId; $user->user_pass = $userPassHash; $user->tag_qr_flag = 1; $user->user_name = $request->input('name'); $user->user_phonetic = $request->input('kana'); $user->user_homephone = is_array($request->input('phone')) ? implode('-', $request->input('phone')) : null; $user->user_mobile = is_array($request->input('mobile')) ? implode('-', $request->input('mobile')) : null; $user->user_birthdate = $request->input('birthdate'); $user->user_primemail = session('email'); $user->user_quit_flag = 0; $user->created_at = now(); $user->updated_at = now(); $user->save(); // セッション削除 session()->forget('email'); // 登録完了メール送信 Mail::send(["text" => 'emails.member_regist_complete'], [ 'user_name' => $request->input('name'), 'user_pass' => $userPass, ], function ($message) use ($user) { $message->to($user->user_primemail)->subject('【So-Manager】ユーザー登録完了のご連絡'); }); // 完了画面に遷移 return view('general.member_regist_complete'); } }