so-manager-dev.com/app/Http/Controllers/UserEditConfirmController.php

231 lines
9.6 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;
// GET: 確認画面表示(戻って修正するボタン等で利用)
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', []);
// 利用者区分ラベル変換
$ward_residents_label = '';
if (isset($input['ward_residents'])) {
if ($input['ward_residents'] === '0') {
$ward_residents_label = '一般';
} elseif ($input['ward_residents'] === '1') {
$ward_residents_label = '学生';
} elseif ($input['ward_residents'] === '2') {
$ward_residents_label = '減免';
} else {
$ward_residents_label = $input['ward_residents'];
}
}
return view('user.confirm', [
'user' => $user,
'input' => $input,
'ward_residents_label' => $ward_residents_label,
'active_menu' => 'SWC-1-1', // この画面のID
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
]);
}
// 編集画面からのPOSTで入力内容確認画面を表示
public function confirm(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');
}
// 本人確認書類画像が画像ファイルかチェック
$rules = [
'photo_filename1' => 'nullable|file|image',
'photo_filename2' => 'nullable|file|image',
];
$messages = [
'photo_filename1.image' => '本人確認書類(おもて)は画像ファイルを選択してください。',
'photo_filename2.image' => '本人確認書類(ウラ)は画像ファイルを選択してください。',
];
$this->validate($request, $rules, $messages);
$input = $request->all();
// ファイル保存処理編集画面→確認画面POST時のみ
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');
$input['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');
$input['photo_filename2'] = $filename2;
}
// 利用者区分ラベル変換
$ward_residents_label = '';
if (isset($input['ward_residents'])) {
if ($input['ward_residents'] === '0') {
$ward_residents_label = '一般';
} elseif ($input['ward_residents'] === '1') {
$ward_residents_label = '学生';
} elseif ($input['ward_residents'] === '2') {
$ward_residents_label = '減免';
} else {
$ward_residents_label = $input['ward_residents'];
}
}
return view('user.confirm', [
'user' => $user,
'input' => $input,
'ward_residents_label' => $ward_residents_label,
'active_menu' => 'SWC-1-1', // この画面のID
'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;
}
// ※ public/storage/photo で画像が参照できない場合は、
// コマンドプロンプトで `php artisan storage:link` を実行してください。
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));
return view('user.mail_sent', [
'active_menu' => 'SWC-1-1', // この画面のID
'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'],
'ward_residents' => $changeData['ward_residents'],
'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', '更新に成功しました。');
}
/**
* パスワードを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;
}
}