so-manager-dev.com/app/Http/Controllers/UserEditConfirmController.php
Yuka Higashide 7a267bd728
All checks were successful
Deploy preview (main_higashide) / deploy (push) Successful in 13s
ユーザー情報変更画面修正 - 本人確認書類アップロード処理
2025-09-02 15:22:08 +09:00

174 lines
7.0 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 Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use App\Mail\UserEditVerifyMail;
use Illuminate\Foundation\Validation\ValidatesRequests;
use App\Http\Controllers\Controller;
class UserEditConfirmController extends Controller
{
use ValidatesRequests;
public function show(Request $request)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user = DB::table('user')->where('user_id', $user_id)->first();
if (!$user) {
return redirect('/login');
}
// 直前のPOST値をold()やsession()->get('_old_input')で取得
$input = session()->get('_old_input', []);
\Log::info('ユーザー情報編集確認画面にアクセス', [
'user_id' => $user_id,
]);
return view('user.confirm', [
'user' => $user,
'input' => $input,
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
// 入力内容確認画面から「変更を確定する」ボタン押下時
public function submit(Request $request)
{
$user_id = session('user_id');
if (!$user_id) {
return redirect('/login');
}
$user = DB::table('user')->where('user_id', $user_id)->first();
if (!$user) {
return redirect('/login');
}
$token = Str::random(64);
$changeData = $request->except(['_token']);
$changeData['user_id'] = $user_id;
// 本人確認書類画像アップロード処理
if ($request->hasFile('photo_filename1') && $request->file('photo_filename1')->isValid()) {
$file1 = $request->file('photo_filename1');
$filename1 = uniqid('photo1_') . '.' . $file1->getClientOriginalExtension();
$file1->storeAs('photo', $filename1, 'public');
$changeData['photo_filename1'] = $filename1;
}
if ($request->hasFile('photo_filename2') && $request->file('photo_filename2')->isValid()) {
$file2 = $request->file('photo_filename2');
$filename2 = uniqid('photo2_') . '.' . $file2->getClientOriginalExtension();
$file2->storeAs('photo', $filename2, 'public');
$changeData['photo_filename2'] = $filename2;
}
Cache::put('change_request_' . $token, $changeData, now()->addDay());
$verifyUrl = route('user.edit.verify', ['token' => $token]);
// Mailableでメール送信
Mail::to($changeData['user_primemail'])->send(new UserEditVerifyMail($verifyUrl, $user));
\Log::info('ユーザー情報変更メール送信完了画面にアクセス', [
'user_id' => $user_id,
]);
return view('user.mail_sent', [
'active_menu' => 'SWC-1-1', // マイページメニューの選択状態用
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
// 認証URLクリック時変更確定処理
public function verify(Request $request)
{
$token = $request->query('token');
$changeData = Cache::get('change_request_' . $token);
if (!$changeData) {
return redirect()->route('user.edit')->withErrors(['register_expired' => '登録期間が過ぎています。もう一度登録してください。']);
}
// 変更内容をDBに保存userテーブル更新
// 更新データ生成photo_filename1, photo_filename2, user_passは入力時のみ追加
$updateData = [
'user_gender' => $changeData['user_gender'] ?? null,
'user_regident_zip' => $changeData['user_regident_zip_1'] . $changeData['user_regident_zip_2'],
'user_regident_pre' => $changeData['user_regident_pre'],
'user_regident_city' => $changeData['user_regident_city'],
'user_regident_add' => $changeData['user_regident_add'],
'user_birthdate' => $changeData['user_birthdate'],
'user_age' => $changeData['user_age'],
'user_homephone' => implode('-', $changeData['user_homephone'] ?? []),
'user_mobile' => implode('-', $changeData['user_mobile'] ?? []),
'user_primemail' => $changeData['user_primemail'],
'user_submail' => $changeData['user_submail'],
// 利用者区分user_categoryidをusertypeテーブルから取得して登録
// 画面からはuser_category一般/学生)が渡ってくる
'user_categoryid' => self::getUserCategoryId($changeData['user_category'] ?? null),
'user_workplace' => $changeData['user_workplace'] ?? null,
'user_school' => $changeData['user_school'] ?? null,
'user_graduate' => $changeData['user_graduate'] ?? null,
'user_relate_zip' => $changeData['user_relate_zip_1'] . $changeData['user_relate_zip_2'],
'user_relate_pre' => $changeData['user_relate_pre'],
'user_relate_city' => $changeData['user_relate_city'],
'user_relate_add' => $changeData['user_relate_add'],
'updated_at' => now(), //
];
if (!empty($changeData['photo_filename1'])) {
$updateData['photo_filename1'] = $changeData['photo_filename1'];
}
if (!empty($changeData['photo_filename2'])) {
$updateData['photo_filename2'] = $changeData['photo_filename2'];
}
if (!empty($changeData['user_pass'])) {
$updateData['user_pass'] = self::customPasswordHash($changeData['user_pass'], $changeData['user_id']);
}
DB::table('user')
->where('user_id', $changeData['user_id'])
->update($updateData);
// キャッシュ削除
Cache::forget('change_request_' . $token);
// 完了画面へ(ユーザー情報確認画面にリダイレクトし、成功メッセージ表示)
return redirect()->route('user.info')->with('success', '更新に成功しました。');
}
/**
* 利用者区分の文言(一般/学生からuser_categoryidを取得
*/
private static function getUserCategoryId($categoryName)
{
if (!$categoryName) return null;
$row = DB::table('usertype')->where('usertype_subject1', $categoryName)->first();
return $row ? $row->user_categoryid : null;
}
/**
* パスワードをSHA256→SALT連結→25回ストレッチでハッシュ化
*/
private static function customPasswordHash($password, $user_id)
{
$salt = $user_id . 'SOMSALT';
$hash = hash('sha256', $password);
$hash .= $salt;
for ($i = 0; $i < 25; $i++) {
$hash = hash('sha256', $hash);
}
return $hash;
}
}