Laravel 5.2 $错误没有出现在Blade中

所以我跟着Laravel 5基础教程一起学习,我被困在表单validation中。 我完全按照教程,但我得到一个未定义的variables:在我创build文章视图中的错误。

在教程中,我正在关注以及我在网上find的内容,他们说错误variables总是存在于刀片文件中供您使用,所以我不知道我在做什么错误?

任何帮助将不胜感激! 爱除了这个错误Laravel!

View @if($errors->any()) <ul class="alert alert-danger"> @foreach($errors->any() as $error) <li>{{$error}}</li> @endforeach </ul> @endif 

调节器

 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; use App\Http\Requests; use App\Http\Requests\UserRequest as UserRequest; // use App\Http\Requests\CreateArticleRequest as CreateArticleRequest; use App\Http\Controllers\Controller; use Illuminate\View\Middleware\ErrorBinder; class UserController extends Controller { public function create(){ return view('pages.signUp'); } public function store(UserRequest $request){ User::create($request->all()); return 'the user has been registered!'; return view('user.profile'); } } 

请求validation

 <?php namespace App\Http\Requests; use App\Http\Requests\Request; class UserRequest extends Request { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required', 'email' => 'required|email', 'country' => 'required', 'password' => 'required|min:6', 'confirm_password' => 'required|same:password', 'height' => 'required', 'weight' => 'required', ]; } } 

这是5.2升级的突破性问题。 发生什么事的是中间件负责让所有视图的errorsvariables不被利用,因为它从全局中间件转移到了web中间件组。

有两种方法可以解决这个问题:

  1. 在您的kernel.php文件中,您可以将中间件\Illuminate\View\Middleware\ShareErrorsFromSession::class移回到protected $middleware属性。

  2. 你可以用路由组包装所有的networking路由,并将web中间件应用到他们。

     Route::group(['middleware' => 'web'], function() { // Place all your web routes here... }); 

解决了

您可以更改以下任何一项:

1.把你的工作路线(app/http/routes.php)

Route::group(['middleware' => ['web']], function () { // Here like Route::get('/', 'TodoController@index'); Route::post('/', 'TodoController@store'); });

截图 –

Screendshot 1

2.将protected $middlewareGroups web (app/Http/Kernel.php)protected $middleware = []

截图 –

screenshot2

这是解决方法:

使用中间件更改路由组的定义,

 Route::group(['middleware' => 'web'], function () { 

 Route::group(['middlewareGroups' => 'web'], function () { 

来源: https : //github.com/laravel/framework/issues/13000

简单地说,你必须移动:

 \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, 

protected $middlewareGroupsprotected $middleware

  1. Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()routes.php页面的Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()中删除, 'middleware' => 'web'

  2. 移动

    \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,

protected $middlewareGroupskarnel.php页面中protected $middleware

正如Laravel文档所述:

注意:如果您的Laravel副本有一个RouteServiceProvider,它已经包含了Web中间件组中的默认路由文件,则不需要手动将该组添加到routes.php文件中。

所以从routes.php文件中删除将是正确的方法。

发布此信息可能对其他用户有用,

正如Smartrahat在第一个解决scheme中提到的,在你的Kernel.php文件( app/Http/Kernel.phpapp/Http/Kernel.php \Illuminate\View\Middleware\ShareErrorsFromSession::class$middlewareGroupsprotected $middleware属性,但是同样会开始抛出错误“会话存储未设置请求”,

解决这个问题\Illuminate\Session\Middleware\StartSession::class,以及$middleware property

从5.2开始, routes.php默认已经由RouteServiceProvider['middleware'=>'web']RouteServiceProvider 。 但是在routes.php缺省的auth路由生成中, Route::group调用仍然是默认的 – 所以如果你从routes.php删除Route::group声明,应用程序就会正确的显示错误。

关于这个问题的一些观察。 首先在那里有一个相关的bug在github这个问题PFA https://github.com/laravel/framework/issues/12022

如果你看一下格雷厄姆写的最后一个评论,我认为那是我面对的。 对于我来说,即使表单发布数据中有一个错误,我也得到了下面的等式

 boolval(count($errors) === 0) === true 

在我的情况下,我在日志中添加了日志

 \Illuminate\Session\Middleware\StartSession::class 

上面的中间件类运行两次给定的请求,我不知道为什么它运行了两次,但我想因为这个$errorsvariables被重置。 我正在使用这种configuration(我认为这是默认的Laravel@5.2.43)

 protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, ]; protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', ], ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; 

我改变了为我工作的configuration,并且$errorsvariables的计数不是零(上面的中间件每个请求只运行一次)

 protected $middleware = [ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, ]; protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', ], ]; protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; 

注意:我的所有路由都在Kernel.phpconfiguration更改前后的web中间件组中,我完全没有从web中间件组移动我的路由。

@foreach($errors->any() as $error)更改为@foreach($errors->all() as $error)

在这种情况下, laravel 5.2你可以参考可能的代码和编辑你的kernal.php文件。 移动这个\Illuminate\View\Middleware\ShareErrorsFromSession::class ,将middleware形成middlewareGroups并添加\Illuminate\Session\Middleware\StartSession::class ,然后middleware正常工作。

在我们的应用程序中既有Web和API的需求,我们也不想移动中间件; 但是,也许这会起作用:

我们有一个非常特殊的情况,即在标准laravel资源方法store()edit()之间正确传输了flash[]$errors会话数据,但是在某些情况下,数据没有得到几乎相同的方法storeSale()editSale()

我们发现,在我们的开发和部署环境中,“文件”和“数据库”会话驱动程序在所有情况下都起作用,但“cookie”驱动程序却不行。

在所有情况下切换到数据库驱动程序解决了这个问题。