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升级的突破性问题。 发生什么事的是中间件负责让所有视图的errors
variables不被利用,因为它从全局中间件转移到了web
中间件组。
有两种方法可以解决这个问题:
-
在您的
kernel.php
文件中,您可以将中间件\Illuminate\View\Middleware\ShareErrorsFromSession::class
移回到protected $middleware
属性。 -
你可以用路由组包装所有的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'); });
截图 –
2.将protected $middlewareGroups web
(app/Http/Kernel.php)
到protected $middleware = []
截图 –
这是解决方法:
使用中间件更改路由组的定义, 从 :
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 $middlewareGroups
到protected $middleware
-
从
Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()
在routes.php页面的Route::group(array('prefix' => 'user', 'middleware' => 'web'), function()
中删除, 'middleware' => 'web'
-
移动
\Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class,
从protected $middlewareGroups
到karnel.php页面中protected $middleware
正如Laravel文档所述:
注意:如果您的Laravel副本有一个RouteServiceProvider,它已经包含了Web中间件组中的默认路由文件,则不需要手动将该组添加到routes.php文件中。
所以从routes.php
文件中删除将是正确的方法。
发布此信息可能对其他用户有用,
正如Smartrahat在第一个解决scheme中提到的,在你的Kernel.php
文件( app/Http/Kernel.php
) app/Http/Kernel.php
\Illuminate\View\Middleware\ShareErrorsFromSession::class
从$middlewareGroups
到protected $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
上面的中间件类运行两次给定的请求,我不知道为什么它运行了两次,但我想因为这个$errors
variables被重置。 我正在使用这种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,并且$errors
variables的计数不是零(上面的中间件每个请求只运行一次)
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”驱动程序却不行。
在所有情况下切换到数据库驱动程序解决了这个问题。