All checks were successful
Deploy preview (main_watanabe) / deploy (push) Successful in 13s
190 lines
7.3 KiB
PHP
190 lines
7.3 KiB
PHP
<?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');
|
||
}
|
||
} |