so-manager-dev.com/app/Http/Controllers/MemberRegistrationController.php
Yu Watanabe 1524ec142d
All checks were successful
Deploy preview (main_watanabe) / deploy (push) Successful in 13s
9/9マージ
2025-09-09 11:32:09 +09:00

190 lines
7.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers;
use App\CommonFunction;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\URL;
class MemberRegistrationController extends Controller
{
// 会員登録案内メール送信
public function sendMail(Request $request)
{
// バリデーションチェック
$rules = ['email' => 'required | email'];
$message = [
'email.required' => 'メールアドレスを入力してください',
'email.email' => 'メールアドレスの形式が正しくありません'
];
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect('general.swo2_1')
->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('general.swo2_1')
->withErrors(['email' => '指定のメールアドレスは既に使用されています。'])
->withInput();
}
}
// 会員登録用暗号化URL生成有効期限30分
$url = URL::temporarySignedRoute('swo2_3', now()->addMinutes(30), ['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.swo2_2');
}
// 入力画面表示
public function index()
{
// 署名付きURLの有効期限チェック
if (!request()->hasValidSignature()) {
return redirect('general.error')->withErrors(['error' => '署名の有効期限が切れています']);
}
// 初回遷移(GETアクセス)時のリクエストパラメータチェック
if (!session()->has('email')) {
// パラメータ存在チェック
$encryptedEmail = request()->query('email');
if (!$encryptedEmail) {
return redirect('general.error')->withErrors(['error' => 'メールアドレスが指定されていません']);
}
// パラメータ整合性チェック
try {
$email = decrypt($encryptedEmail);
} catch (\Exception $e) {
return redirect('general.error')->withErrors(['error' => 'メールアドレスの情報が不正です']);
}
// 二重登録防止チェック
$existingMember = User::where('user_primemail', $email)->get();
foreach ($existingMember as $member) {
if ($member->user_quit_flag != 1) {
return redirect('general.error')->withErrors(['error' => '既に登録済みです']);
}
}
// メールアドレスをセッションに保存
session(['email' => $email]);
}
// 入力画面に遷移
return view('general.swo2_3');
}
// 確認画面表示
public function confirm(Request $request)
{
// 登録完了後のブラウザバックによる二重登録対策
if (!session()->has('email')) {
return redirect('general.error')->withErrors(['error' => '不正なアクセスです']);
}
// 入力チェック内容 (メールアドレスはセッションから取得するため対象外)
$rules = [
'name' => 'required',
'kana' => 'required|regex:/^[ァ-ヶー]+$/u',
'phone.*' => 'required|regex:/^[0-9]+$/',
'mobile.*' => 'nullable|regex:/^[0-9]+$/',
];
// エラーメッセージ (メールアドレスはセッションから取得するため対象外)
$message = [
'name.required' => '名前を入力してください',
'kana.required' => 'フリガナを入力してください',
'kana.regex' => 'フリガナは全角カタカナで入力してください',
'phone.*' => '電話番号を正しく入力してください',
'mobile.*' => '予備電話番号を正しく入力してください',
];
// バリデーションチェック
$validator = Validator::make($request->all(), $rules, $message);
if ($validator->fails()) {
return redirect('general.swo2_3')
->withErrors($validator)
->withInput();
}
// 画面返却値
$input_data = [
"name" => $request->input('name'),
"kana" => $request->input('kana'),
"phone" => $request->input('phone'),
"mobile" => $request->input('mobile'),
"email" => session('email'),
];
// 確認画面に遷移
return view('general.swo2_4', ['input_data' => $input_data]);
}
// 会員登録 or 戻る
public function complete(Request $request)
{
// 前の画面に戻る
if($request->input('back') == 'back'){
return redirect('general.swo2_3')->withInput();
}
// 登録完了後のブラウザバックによる二重登録対策
if (!session()->has('email')) {
return redirect('general.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 = $request->input('phone');
$user->user_mobile = $request->input('mobile');
$user->user_primemail = session('email');
$user->user_quit_flag = 0;
$user->created_at = now();
$user->updated_at = now();
$user->save();
// 登録完了メール送信
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】ユーザー登録完了のご連絡');
});
// セッション削除
session()->forget('email');
// 完了画面に遷移
return view('general.swo2_5');
}
}