質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1535閲覧

【Laravel】session機能を使って既存のユーザー情報(メールアドレス)を変更したい

ra-men_love

総合スコア6

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/07/01 09:00

編集2021/07/01 09:56

やりたいこと

現在、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を使えているのですが、なぜか、このメソッドだけエラーを返してしまします。
エラー内容は前回と同様です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Auth::id()に変更したところ解決しました。

投稿2021/07/01 11:01

ra-men_love

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問