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

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

ただいまの
回答率

87.94%

Laravel5.5 でのバリデーション処理でのテンプレートの扱いが分かりません

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,406

score 189

Laravel 5.5 を勉強しています。
お問い合わせのフォームのようなものを試しに作成していますが、エラー処理の際に
エラーの有無で切り分けたいと思っています。
単に、テンプレートファイル内にコードを入れて見えづらくするのを回避したいためです。
構想を書くと
if エラーあり
//エラー内容と入力内容を表示
return view("input_error.blade");
else
//確認画面
return view("confirm.blade"); 

という形にしたいと思っています。
公式ドキュメントを参考にすると
エラー時に

 if($validator->fails())
        {
            return redirect('/input_error')->withErrors($validator)->withInput();
        }


としなければいけないのかなと考え込んでしまいました。
これをすると入力値がセッションから取得をしなければいけないようで手間があるように思います。
このようなリダイレクトを回避することは可能でしょうか?
そもそも、リダイレクトをしなければいけないでしょうか?

現状以下のようにしています。

namespace App\Http\Controllers;
use Validator;
use Illuminate\Http\Request;

class Contact extends Controller
{
    //
    public function index(){
        return view('input');
    }

    //confirm
    public function confirm(Request $request){
        header('Expires:-1');
        header('Cache-Control:');
        header('Pragma:');
        $validator = Validator::make($request->all(), [
            'name'=>'required|min:6|max:10',
            'email'=>'required|email|confirmed',
            'sex'=>'required',
            'contents'=>'required|max:10',
        ]);
        //if fails
        if($validator->fails())
        {
            return redirect('/input_error')->withErrors($validator)->withInput();
        }
        $name = Request::input('name');
        $email = Request::input('email');
        $sex = Request::input('sex');
        $contents = Request::input('contents');
        return view('confirm',compact('name','sex','email','contents'));
    }

    public function input_error(){
        return view('input_error');
    }

    //
    public function thanks(){
        return view('thanks');
    }


web.php

Route::get('/input', 'Contact@index');
Route::post('/input_error', 'Contact@input_error');
Route::get('/input_error', 'Contact@input_error');
Route::post('/confirm', 'Contact@confirm');
Route::get('/thanks', 'Contact@thanks');


としてます。
リダイレクトをしなくても
変数、エラーメッセージが普通に取得し表示できるでしょうか?
宜しくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

Controller

if ($validator->fails()) {
    /** @var array $params */
    $params = $request->all();
    /** @var array $errors */
    $errors = $validator->getMessageBag()->all();
    $params['errors'] = $errors;
    return view('input_error', $params);
}

View

<p>名前: {{$name}}</p>
<p>性別: {{$sex}}</p>
...
<h2>エラーメッセージ</h2>
@foreach($errors as $error)
<p>{{$error}}</p>
@endforeach

今動かせる環境がないですが、例えばこんな感じで記述したらいかがですが?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/20 18:10

    キーで取得したいなら、
    $errors = $validator->getMessageBag();
    でオブジェクトをそのまま渡し、viewで
    $errors->get('name');
    のようにすればできるかと思います。

    キャンセル

  • 2018/01/20 18:28

    おお、なるほどです。
    個別にname属性を与えて引き出すことができるんですね。やってみます。
    ご返答有難うございました

    キャンセル

  • 2018/01/22 12:25

    <input type="text" name="name" id="name" class="form-control" placeholder="Name" value="{{$name}}" />
    <span class="help-block text-warning">{{$errors->first('name')}}</span>
    このような形で表現できるという情報がありやってみたところ、うまくいきました。
    手探りですが、ちょっとずつ前に進んでいます。有難うございました

    キャンセル

0

利用するBladeテンプレートを入れ替えたいというだけれあれば、単にview関数で利用するテンプレートを変更すればよいだけです。

       if($validator->fails())
        {
            return view('input_error');
        }


あとは、Bladeテンプレート内で、$errorsやold()ヘルパーなどを使うと良いかと思います。
Laravel 5.5 HTTPリクエスト
Laravel 5.5 バリデーション

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/01/20 16:20 編集

    Laravelで.envのAPP_DEBUGをtrueにしているときに、デバッグ表示ができる以下のツールなどでSessionの値を確認してみると解決に繋がるかと思います。
    [barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)
    [開発に欠かせない Laravel Debugbar の導入](https://larapet.hinaloe.net/2017/03/07/%E9%96%8B%E7%99%BA%E3%81%AB%E6%AC%A0%E3%81%8B%E3%81%9B%E3%81%AA%E3%81%84-laravel-debugbar-%E3%81%AE%E5%B0%8E%E5%85%A5/)

    Chromeを使っている場合は、以下のライブラリがChromeDevToolsと統合されて使いやすいです。
    [itsgoingd/clockwork](https://github.com/itsgoingd/clockwork)

    キャンセル

  • 2018/01/20 16:25

    ごかいとう
    >ビューレスポンスで扱う場合はリクエストパラメータをコントローラで取得して持たせるような処理が必要

    ということはviewの第二引数でcompact 関数を利用して渡してあげるということでしょうか?
    もしくはwithとかをつかうのでしょうか?

    キャンセル

  • 2018/01/20 16:26

    ↑ご回答有難うございました。

    中途半端で確定してしまいました。すみません

    キャンセル

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

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

関連した質問

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