【问题标题】:Undefined variable: errors -- Laravel 5.2未定义的变量:错误——Laravel 5.2
【发布时间】:2016-04-01 03:55:50
【问题描述】:

我是 Laravel 新手,使用的是 laravel 5.2 版。

我创建了一个控制器和请求,分别命名为 ArticlesControllerCreateArticleRequest,并定义了一些验证规则。

CreateArticleRequest

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CreateArticleRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title' => 'required|min:3',
            'body' => 'required|max:400',
            'published_at' => 'required|date',
        ];
    }
}

ArticlesController

<?php

namespace App\Http\Controllers;

use App\Article;
//use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use App\Http\Requests\CreateArticleRequest;

class ArticlesController extends Controller
{

    public function add(){
        return view('articles.add');
    }

    public function create_article_row(CreateArticleRequest $request){
        Article::create($request->all());
        return redirect('articles/');
    }
}

当我在名为 add.blade.php 的模板中使用 $errors 变量时,它会显示错误 undefined variable: $errors 我试图解决这个问题,但我没有。请告诉我我错在哪里。 add.blad.php

{{ var_dump($errors) }}

【问题讨论】:

  • 使用isset 进行基本检查,因此如果未设置变量,则不会回显。
  • @MichaelSørensen 这是 Laravel,该变量应该在所有视图中始终可用。因此,如果它不是在一个视图中设置,它可能是一个需要全局解决的问题。
  • @MichaelSørensen 我正在关注 laravel 教程,并且已经完成了我所做的相同工作,但它显示了未定义的变量 $errors 我也尝试使用 isset($error) 检查但在验证时确实如此'不显示任何错误。

标签: php laravel laravel-5.2


【解决方案1】:

使用此代码,您可以捕获错误并显示它们:

@if ($errors->any())
 <div class='alert alert-danger'>
  @foreach ( $errors->all() as $error )
   <p>{{ $error }}</p>
  @endforeach
 </div>
@endif

【讨论】:

  • 是的,我们可以通过这种方式捕获错误消息,但这不是我的问题。我的问题是我面临这样的错误:未定义的变量 $errors。仔细阅读问题。
  • 也许这可以帮助你:stackoverflow.com/questions/34420590/…
  • @Kokno 的评论可能应该是一个答案。链接上的回复很好地解释了从 5.1 到 5.2 的变化
【解决方案2】:

这是 5.2 升级的一个重大问题。正在发生的事情是负责使 errors 变量可用于所有视图的中间件没有被使用,因为它已从全局中间件移动到 web 中间件组。

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

  1. 在您的kernel.php 文件(app/Http/Kernel.php) 中,您可以将middleware \Illuminate\View\Middleware\ShareErrorsFromSession::class 移回protected $middleware 属性。

  2. 使用路由组包装所有web 路由并将网络中间件应用于它们:

    Route::group(['middleware' => 'web'], function() {
        // Place all your web routes here...(Cut all `Route` which are define in `Route file`, paste here) 
    });
    

复制自这篇帖子Laravel 5.2 $errors not appearing in Blade

【讨论】:

【解决方案3】:

只需从 routes.php 文件中剪切所有路由并将其粘贴到中间件组“web”之间,就像这样:

Routes file

【讨论】:

  • 这样做给了我一个FatalErrorException -- Call to a member function parameters() on null
【解决方案4】:

发布这个可能对其他人有用,

正如 Praveen 在第一个解决方案中提到的那样,在您的 Kernel.php 文件(app/Http/Kernel.php)中移动 \Illuminate\View\Middleware\ShareErrorsFromSession::class$middlewareGroupsprotected $middleware 属性,但同样会开始抛出错误“Session store not set on request”,

解决这一举动 \Illuminate\Session\Middleware\StartSession::class,$middleware property 也是如此。

【讨论】:

  • middleware property 在哪里?
【解决方案5】:

对于 5.2,只需将具有错误变量的路由移动到中间件组

【讨论】:

    【解决方案6】:

    这是因为下面的文件在 composer 更新过程中没有更新,所以没有实现 mapWebRoutes 方法。

    app/Providers/RouteServiceProvider.php
    

    从全新安装中复制此文件即可。更好的是,按照文档上的升级路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-02
      • 2016-04-05
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多