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

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

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

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Laravel

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

3137閲覧

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

hidepon

総合スコア206

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Laravel

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/01/20 06:21

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');

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

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

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

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

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

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

guest

回答2

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 07:42

doubutsu.karada

総合スコア26

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

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

hidepon

2018/01/20 09:02

ご回答有難うございます。なるほどです。エラーメッセージがの配列の引数がneme属性で設定できないのが難ですね・・・ドキュメントを見てみます。本当にありがとうございます。
hidepon

2018/01/20 09:07

性別のチェックボックスのエラーチェックが無いときに、引数がずれてしまい、warningになってしまいます。やはりname属性で割り当てしないと困りますね・・・。 エラーの内容を各項目の横に配置するようにしています。 教えて頂いた内容でいうと$errors[0],$errors[1],$errors[2]。。。となりますよね。うーん困りました。
doubutsu.karada

2018/01/20 09:10

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

2018/01/20 09:28

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

2018/01/22 03: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> このような形で表現できるという情報がありやってみたところ、うまくいきました。 手探りですが、ちょっとずつ前に進んでいます。有難うございました
guest

0

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

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

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

投稿2018/01/20 06:35

aro10

総合スコア4106

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

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

hidepon

2018/01/20 06:39

ご返答有難うございます。この記述で自動的に、postデータの内容ややエラーメッセージをviewに渡すことができるんですね・・・。ちょっとやってみます。
aro10

2018/01/20 06:49 編集

$errorsは必ずBladeで使える変数です。 oldも第二引数でデフォルト値を設定できるので、利用するとコード量短縮に繋がります。 old("フォームのname","デフォルト値") [Laravel 5.5 ヘルパ old()](https://readouble.com/laravel/5.5/ja/helpers.html#method-old)
doubutsu.karada

2018/01/20 07:08

Validator::makeでインスタンスを生成した場合、そのままviewで$errorsを使うと中身って空になりませんか?もし空であるならコントローラをリファクタするかwith()などで持たせる必要があるかと思います。場違いなコメントでしたら申し訳ないです。
aro10

2018/01/20 07:11 編集

ドキュメントのこの記述を元にした内容ですが、例外の状況はあるかもしれません。 [Laravel 5.5 バリデーション](https://readouble.com/laravel/5.5/ja/validation.html) > Tip!! $errors変数はwebミドルウェアグループに所属する、Illuminate\View\Middleware\ShareErrorsFromSessionミドルウェアによりビューに結合されます。このミドルウェアが適用される場合は、いつでもビューの中で$errors変数が使えます。$errors変数はいつでも定義済みであると想定でき、安心して使えます。
hidepon

2018/01/20 07:14

ご返答を頂き有難うございます。ちょっとやってみたのですが、errors変数は空になってしまっています。 oldに関しては <input type="text" name="name" id="name" class="form-control" placeholder="Name" value="{{ old("name") }}" /> としても何も表示されないのですが、何か必要なのでしょうか? 初心者でうまく理解できていなくて申し訳ないです。よろしくお願いいたします。
doubutsu.karada

2018/01/20 07:18

oldなども結局sessionから取得しているはずなので、ビューレスポンスで扱う場合はリクエストパラメータをコントローラで取得して持たせるような処理が必要かと思います。
aro10

2018/01/20 07:21 編集

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)
hidepon

2018/01/20 07:25

ごかいとう >ビューレスポンスで扱う場合はリクエストパラメータをコントローラで取得して持たせるような処理が必要 ということはviewの第二引数でcompact 関数を利用して渡してあげるということでしょうか? もしくはwithとかをつかうのでしょうか?
hidepon

2018/01/20 07:26

↑ご回答有難うございました。 中途半端で確定してしまいました。すみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問