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

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

ただいまの
回答率

87.50%

例外処理でviewに戻す時にoldヘルパーに値を設定したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,529

score 15

前提

Laravelの学習の一環でログイン画面を自作しています。
ですのでmake:authは使っていません。

ログイン画面はメールアドレスとパスワードがDBデータと一致する事でログイン出来ます。

実現したいこと

登録されているメールアドレスだがパスワードが一致しない場合、
入力されたメールアドレスを保持したままエラーメッセージと共にログイン画面に戻したい。

発生している問題

①:パスワードはハッシュ化されているのでバリデーションの'exists'で比較するやり方がわかりません。
もしハッシュ化されたまま比較する事が可能なら書き方を教えて頂きたいです。

②:①が実現出来ないのでメールが一致したデータを先に取得し、そのパスワードに対して
Hash::checkを行ったあとif文でログイン画面に戻そうとしたが
value="{{ old('email') }}"に入力されたメールアドレスをセットするやり方がわかりません。
oldヘルパーのemailに$request->emailをセットするやり方を教えて頂きたいです。

該当のソースコード

    public function login(LoginRequest $request)
    {
      try {
          $user = User::where('email', $request->email)->firstOrFail();
      } catch (ModelNotFoundException $e) {
          return view('auth.login')->with([
              'message' => 'メールまたはパスワードが正しくありません。',
        // ここに追加したいがoldヘルパーにメールを設定する書き方がわからない
          ]);
      }


      if(Hash::check($request->password, $user->password)) {
        //ログイン成功処理
      } else {
          return view('auth.login')->with([
              'message' => 'メールまたはパスワードが正しくありません。',
        // ここに追加したいがoldヘルパーにメールを設定する書き方がわからない
          ]);
      }
@extends('layouts.default')


@section('content')
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{'ログイン'}}</div>
                       <div class="card-body">
                     @isset ($message)
                        <div>
                          <p><strong>{{ $message }}</strong></p>
                        </div>
                     @endisset
                     <form method="POST" action="{{ url('login') }}">
                       @csrf
                          <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{'メール'}}</label>
                            <div class="col-md-6">
                              <input id="email" type="text" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" autofocus>

                              @if ($errors->has('email'))
                                <span class="invalid-feedback" role="alert">
                                    <strong>{{ $errors->first('email') }}</strong>
                                </span>
                              @endif
                            </div>
                          </div>
                          <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{'パスワード'}}</label>
                            <div class="col-md-6">
                              <input id="password" type="password" class="form-control{{ $errors->has('password') ? ' is-invalid' : '' }}" name="password" value="{{ old('password') }}" required maxlength="191">

                              @if ($errors->has('password'))
                                  <span class="invalid-feedback" role="alert">
                                      <strong>{{ $errors->first('password') }}</strong>
                                  </span>
                              @endif
                            </div>
                          </div>
    public function rules()
    {
        return [
          'email' => 'required|string|email|max:100',
          'password' => 'required|string' //existsも追加したいがハッシュ化されているので一致しない
        ];
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

oldで参照したいなら、
「Loginできない」と判断した場合にreturn view()で画面を表示するのではなく、
入力値を保持させて、ログイン画面(1つ前の画面)に戻すのが良いと思います。

return back()//1つ前の入力画面に戻す
       ->withInput()//入力値を保持する
       ->with([
              'message' => 'メールまたはパスワードが正しくありません。',
       ]);

FormRequestでバリデーションエラーが発生した時も、内部的には上記と似たようなことをしているのです。

この方法なら、ログイン画面のviewを返す部分は、「本来のログイン画面」のみになる(はず)なので、viewの名前をあちらこちらに書かずに済む点でも簡単です。

なお、この場合withで渡したmessageはセッションに保持されていますので、view側では$messageではなく、

@if(session()->has('message'))
  <div>
    <p><strong>{{ session()->get('message') }}</strong></p>
  </div>
@endif


こんな感じで使うようになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/20 16:58

    ちょっと時間開いちゃいましたが・・

    何故できないのでしょうかね・・?
    確認ですが、LoginRequest でバリデーションエラーになる場合は、oldで値が取れていますよね??
    あと、laravelのバージョンっていくつでしょうか?

    キャンセル

  • 2019/02/23 14:55

    すみません。。。
    色々試していた時に書いた$request->session()->flashの処理を
    消し忘れており、それが原因でした。
    今は問題なく渡せております。ありがとうございました。
    また、今後このような事がないよう気を付けたいと思います。

    キャンセル

  • 2019/02/25 09:44

    解決できたのであれば、何よりです^^

    キャンセル

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

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る