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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

14551閲覧

Laravel5.1 "Undefined variable: errors" が表示される

YATORI

総合スコア13

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2016/01/15 17:08

編集2016/01/20 03:33

###前提・実現したいこと
◆前提
下記サイトをもとに、Laravel5.1の学習をしております。
初めてのLARAVEL 5.1 : (17) VALIDATION(入力チェック)

◆実現したいこと
VALIDATIONを実装したい。

###発生している問題・エラーメッセージ
サイト通りに実装。
「$errors」が記載されているviewを表示したら
「Undefined variable: errors」
が表示されました。
当然ですが、$errorsの箇所(@if~@endif)を外すと正常に表示されます。

いろいろなサイトを調べてみましたが、同じ症状な方は見当たらず・・・

ふらふらといろんなサイトをさまよって
バリデーションに関して下記サイトにたどり着きました。
Larabel5.1 バリデーション

"バリデーションエラー表示"の項目を見てみると「$errors」変数についての記述が。

「全リクエストの全ビューで、いつでも$errors変数は利用できるのが、重要なポイントです。」

とあります。
これは、無条件で$errors変数をview内で利用可能で、
バリデーションエラー時に$errors変数に自動的にメッセージが詰め込まれてviewまで渡ってくるという理解でいいのでしょうか?

どのサイトにも当たり前のように利用している記載があるので、
何か手順を間違っているのか、何をどうすればいいのかもわからない状態となっています。

どなたか、お力添え頂ければ幸いです。

###ソースコード

php

1// resources/views/articles/create.blade.php 2 3@extends('layout') 4 5@section('content') 6 <h1>Write a New Article</h1> 7 8 <hr/> 9 {{-- エラーの表示を追加 --}} 10 @if ($errors->any()) 11 <div class="alert alert-danger"> 12 <ul> 13 @foreach ($errors->all() as $error) 14 <li>{{ $error }}</li> 15 @endforeach 16 </ul> 17 </div> 18 @endif 19 {!! Form::open(['url' => 'articles']) !!} 20...省略 21 {!! Form::close() !!} 22@endsection

php

1// app/Http/routes.php 2 3<?php 4 5/* 6|-------------------------------------------------------------------------- 7| ルートファイル 8|-------------------------------------------------------------------------- 9| 10| ここでアプリケーションのルートを全て登録してください。 11| 簡単です。ただ、Laravelへ対応するURIと、そのURIがリクエスト 12| されたときに呼び出されるコントローラーを指定してください。 13| 14*/ 15 16//Route::get('/', function () { 17// return view('welcome'); 18//}); 19Route::get('/', 'WelcomeController@index'); 20 21Route::get('articles', 'ArticlesController@index'); 22Route::get('articles/create', 'ArticlesController@create'); 23Route::get('articles/{id}', 'ArticlesController@show'); 24Route::post('articles', 'ArticlesController@store'); 25 26// ホーム(ログインしていないと見れないよう auth middleware を適用) 27Route::group(['middleware' => 'auth'], function() { 28 Route::get('/home', function () { 29 return view('home'); 30 }); 31}); 32 33/* 34|-------------------------------------------------------------------------- 35| アプリケーションのルート 36|-------------------------------------------------------------------------- 37| 38| このルートグループは、"web"ミドルウェアグループが指定された 39| 全ルートに対し適用されます。"web"ミドルウェアグループは 40| HTTPカーネルで定義されており、セッションの開始やCSRF保護などを含んでいます。 41| 42*/ 43 44Route::group(['middleware' => ['web']], function () { 45 // 46}); 47 48

php

1// app/Http/Kernel.php 2 3<?php 4 5namespace App\Http; 6 7use Illuminate\Foundation\Http\Kernel as HttpKernel; 8 9class Kernel extends HttpKernel 10{ 11 /** 12 * アプリケーションのグローバルHTTPミドルウェアスタック 13 * 14 * These middleware are run during every request to your application. 15 * 16 * @var array 17 */ 18 protected $middleware = [ 19 \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 20 ]; 21 22 /** 23 * アプリケーションのルートミドルウェアグループ 24 * 25 * @var array 26 */ 27 protected $middlewareGroups = [ 28 'web' => [ 29 \App\Http\Middleware\EncryptCookies::class, 30 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 31 \Illuminate\Session\Middleware\StartSession::class, 32 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 33 \App\Http\Middleware\VerifyCsrfToken::class, 34 ], 35 36 'api' => [ 37 'throttle:60,1', 38 ], 39 ]; 40 41 /** 42 * アプリケーションのルートミドルウェアスタック 43 * 44 * These middleware may be assigned to groups or used individually. 45 * 46 * @var array 47 */ 48 protected $routeMiddleware = [ 49 'auth' => \App\Http\Middleware\Authenticate::class, 50 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 51 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 52 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 53 ]; 54} 55 56

###補足情報(言語/FW/ツール等のバージョンなど)
OS:Windows10 Pro
◆Laravelの実行環境
・virtualBox
・vagrant
・Laravel Framework version 5.2.7 (Homestead)
・PHP 5.6.15

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

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

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

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

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

MasahiroHarada

2016/01/20 02:34 編集

ミドルウェア周りを確認させて頂きたいので、config/route.php および app/Http/Kernel.php の内容をお見せ頂くことは可能でしょうか。 また、Laravelのバージョンを今一度ご確認頂けますでしょうか。 ※プロジェクトディレクトリで「php artisan --version」で確認できます。
guest

回答2

0

ベストアンサー

ご利用のLaravelはバージョン5.2のようですね!
5.2は5.1からミドルウェア周りの設定が少し変更されたようなので、エラーの原因はそこだと思います。
(私も5.2を使い始めた時に同じエラーに遭遇したことがありますので…!)

「全リクエストの全ビューで、いつでも$errors変数は利用できるのが、重要なポイントです。」
なぜ上記の機能が実現できているかといいますと、エラーをセッションに入れているからです。
そして、その機能は、Kernel.php の $middlewareGroups['web'] 内に記載されている、
StartSessionミドルウェアとShareErrorsFromSessionミドルウェアで実現されているようです。

PHP

1protected $middlewareGroups = [ 2 'web' => [ 3 // ~中略~ 4 \Illuminate\Session\Middleware\StartSession::class, 5 \Illuminate\View\Middleware\ShareErrorsFromSession::class, 6 // ~中略~ 7 ], 8 // ~中略~ 9 ];

そういう訳なので、$errors変数を使用するのであれば、
StartSessionミドルウェアとShareErrorsFromSessionミドルウェアを
ルーティングに適用する必要があります。

具体的には、route.php上部のルーティングを、
下記のように'web'ミドルウェアグループで囲ってやることで、エラーは解消すると思われます。

PHP

1Route::group(['middleware' => ['web']], function () { 2 Route::get('/', 'WelcomeController@index'); 3 4 Route::get('articles', 'ArticlesController@index'); 5 Route::get('articles/create', 'ArticlesController@create'); 6 Route::get('articles/{id}', 'ArticlesController@show'); 7 Route::post('articles', 'ArticlesController@store'); 8});

参考になれば幸いです。

投稿2016/01/20 04:16

MasahiroHarada

総合スコア59

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

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

YATORI

2016/01/21 08:35

回答ありがとうございます! なるほど、バージョンの関係もあったのですね・・・ ご指摘いただいた箇所の修正によって無事解決することができました! 気になっていた仕様の部分まで解説いただき、理解を深めることができました。 Laravelを利用する上でどうしても解決しておきたい部分でしたので、 ズバリな回答をいただき本当に感謝しております。 ありがとうございました!
guest

0

php

1 @if (isset($errors) && $errors->any()) 2 <div class="alert alert-danger"> 3 <ul> 4 @foreach ($errors->all() as $error) 5 <li>{{ $error }}</li> 6 @endforeach 7 </ul> 8 </div> 9 @endif

投稿2016/01/15 17:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YATORI

2016/01/16 17:34

回答ありがとうございます。 回答いただいた方法ですが、 もちろん画面表示時のエラー(Undefined variable: errors)は回避されるのですが、 バリデーションチェックでエラーメッセージが表示されない症状が出ます。 いずれにせよ$errors変数がviewまで渡ってきておらず、 せっかく回答いただいて恐縮なのですが、 まだ根本の解決には至っておりません。
退会済みユーザー

退会済みユーザー

2016/01/16 18:40 編集

> いずれにせよ$errors変数がviewまで渡ってきておらず 渡していないか、渡しているのに、正しく取得していないかのいずれかの問題でしょう。提示されている情報から推測できるのは今程度です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問