やりたいこと
現在、Laravelを勉強しており、Laravelを使った掲示板を作成しています。
その中で、会員登録したアカウントのメールアドレス変更を行うシステムを作っています。
〇流れ
メールアドレス変更画面から新しいメールアドレスを入力(この時にメールアドレスをセッションに保存)
↓
emailトークン(メールアドレス認証)を発行して、DBのemail_verify_tokenに保存
↓
localhost:81/board/verify/{token}のtoken部分に直接作成したemailtokenを入力し、tokenが正しければ、DB内のemail_verify_tokenをnullにする。
↓
ユーザー認証が出来たら、セッションに保存しておいたメールアドレスを取得し、usersテーブルに上書き保存
↓
マイページに戻る
起きている問題
セッションに保存する所までは出来たのですが、emailトークンを発行する際にエラーが発生してしまいます。
3. 関連するソースコード
web.php
//メールアドレス仮登録 Route::view('/board/email/change', 'prechange')->name('prechange'); //メールアドレスをセッションに保存して、emailtokenを発行 Route::post('/board/email/change', 'SettingController@createEmailToken'); //メール送信完了ぺージ Route::view('/board/mail-sent', 'change_mail-sent')->name('change_mail_sent'); //メールサーバーを持っていないため、ルーティングに直接して、tokenが正しければDBのtokenをnullにする(メールアドレス認証) Route::get('/board/verify/{token}', 'SettingController@verifyEmail'); //セッションを取得して、DBに上書き保存 Route::post('/board/email','SettingController@email_store')->name('email_store');
prechange.blade.php
@extends('layout') @section('content') <div style="width:800px;margin:60px auto;"> <h2>仮メールアドレス変更</h2> <form method="post"> @csrf <input type="email" name="email" class="form-control" value="{{ old('email') }}" placeholder="emailを入力してください"> @if ($errors->has('email')) @foreach($errors->get('email') as $message) <p class="error"> {{ $message }} </p> @endforeach @endif <input type="submit" value="送信" class="btn btn-dark"> </form> </div> @endsection
change_mail_sent.blade.php
@extends('layout') @section('content') <div style="width:800px;margin:60px auto;"> <h2 style="text-align: center;">メール送信完了</h2> </div> @endsection
SettingController.php
public function createEmailToken(Request $request){ //Validation部分 $rule = [ 'email' => 'required|max:500', ]; $messages = [ 'email.required' => 'メールアドレスは必ず入力してください。', 'email.max' => 'メールアドレスは500文字以内で入力してください。' ]; $validator = Validator::make($request->all(), $rule, $messages); if ($validator->fails()) { return redirect()->route('prechange') ->withErrors($validator) ->withInput(); } $request->session()->put('email', $request->input('email')); User::prechange(); return redirect()->route('change_mail_sent'); }
User.php
public function prechange(){ //ログイン中のユーザー情報を探す $user = User::where('id',Auth::get())->first(); $user->email_verify_token = Str::random(40); $user->save(); }
4. 試したこと
createEmailTokenメソッドでsession保存後
var_dump($request->session()->get('email'));
を行ったところ、保存が確認されたため、emailトークン作成時にエラーが発生していると考えています。(DBを確認したところ、emailトークンは作成されていませんでした)
1.ルーティングが被っているためエラーが発生していると思いましたが、
Route::get('/board/email', 'SettingController@prechange')->name('prechange'); Route::post('/board/email/change', 'SettingController@createEmailToken');
ルーティング内容を変えて、関連部分も同様に変更しましたが、エラーのままでした。
2.新規登録の際にセッション機能を利用していたため、そこでエラーが発生していると思い、セッション内容を一度削除して、改めてセッション内容を保存しましたが、エラーのままでした。
同じような状況で同様のエラーがでいる方が見つからなかったためこちらで質問させて頂きました。
もし、不足分などありましたら教えて頂きたいと思っております。
ご教授お願いします。
5. 使用言語・ライブラリのバージョン
Laravel Framework 6.20.27
変更点
上記の内容を踏まえて、Userモデル内でAuthを使ったことでエラーが出ている可能性があったため、
下記のように、モデル内ではなくcontrollerの中でAuthを使うように変更しました。
web.php
Route::get('/board/email', 'SettingController@prechange')->name('prechange'); Route::post('/board/email/change', 'SettingController@createEmailToken')->name('email_token'); Route::view('/board/mail-sent', 'change_mail-sent')->name('change_mail_sent'); Route::get('/board/verify/{token}', 'SettingController@verifyEmail'); Route::post('/board/email','SettingController@email_store')->name('email_store');
SettingController.php
public function prechange(){ $user = User::where('id',Auth::get())->first(); $user_name = $user->name; return view('prechange',['user_name'=>$user_name]); } public function createEmailToken(Request $request){ //Validation部分 $rule = [ 'email' => 'required|max:500', ]; $messages = [ 'email.required' => 'メールアドレスは必ず入力してください。', 'email.max' => 'メールアドレスは500文字以内で入力してください。' ]; $validator = Validator::make($request->all(), $rule, $messages); if ($validator->fails()) { return redirect()->route('prechange') ->withErrors($validator) ->withInput(); } $request->session()->put('email', $request->input('email')); User::prechange($request->get('uer_name')); return redirect()->route('change_mail_sent'); }
User.php
public function prechange($user_name){ $user = User::where('name',$user_name)->first(); $user->email_verify_token = Str::random(40); $user->save(); }
上記で実行した場合、
prechangeメソッドで引っかかっているようでした。
同controller内の他メソッドではAuthを使えているのですが、なぜか、このメソッドだけエラーを返してしまします。
エラー内容は前回と同様です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。