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

时间:2015-12-23 15:05:19

标签: php laravel laravel-5.2

所以我跟随Laravel 5基础知识教程,我坚持表单验证。我完全按照教程进行了操作,但我得到了一个未定义的变量:我的创建文章视图中的错误。

在我关注的教程和我在网上找到的内容中,他们说刀片文件中的错误变量始终存在,供您使用,所以我不知道我做错了什么?

任何帮助将不胜感激!喜欢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');
    }

}

请求验证

<?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',
        ];
    }
}

11 个答案:

答案 0 :(得分:39)

这是5.2升级的一个突破性问题。正在发生的是中间件,它负责使所有视图可用的system_profiler SPUSBDataType变量未被利用,因为它已从全局中间件转移到ioreg -p IOUSB -l -w 0中间件组。

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

  1. errors文件中,您可以将中间件web移回kernel.php媒体资源。

  2. 您可以使用路由组包装所有Web路由,并将\Illuminate\View\Middleware\ShareErrorsFromSession::class中间件应用于它们。

    protected $middleware

答案 1 :(得分:23)

<强>解决

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

<强> 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

答案 2 :(得分:18)

简单来说,你必须搬家:

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

protected $middlewareGroupsprotected $middleware

答案 3 :(得分:18)

这是解决方案:

使用中间件更改路线组的定义:

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

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

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

答案 4 :(得分:6)

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

  2. 移动

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

  3. kernel.php 页面中的protected $middlewareGroupsprotected $middleware

    正如Laravel文档所说:

      

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

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

答案 5 :(得分:5)

发布此内容可能对其他人有用,

正如第一个解决方案中提到的Smartrahat,在Kernel.php文件(app/Http/Kernel.php)中移动\Illuminate\View\Middleware\ShareErrorsFromSession::class$middlewareGroupsprotected $middleware属性,但同样会开始抛出错误&#34;会话存储未按请求设置&#34;,

解决此举动 \Illuminate\Session\Middleware\StartSession::class,也可以$middleware property

答案 6 :(得分:5)

自5.2起,routes.php默认情况下已在['middleware'=>'web'] RouteServiceProvider的上下文中调用。但是在routes.php默认生成的身份验证路由中,默认情况下仍会发生Route::group调用 - 因此,如果从Route::group应用程序中删除routes.php声明,则应用程序会正确显示错误。

答案 7 :(得分:4)

关于这个问题的几点意见。首先,github中有关于此问题的相关错误 PFA https://github.com/laravel/framework/issues/12022

如果你看看格雷厄姆写的最后一条评论,我认为这是我面临的问题。 对我来说即使表单发布数据有错误,我也得到了以下相等

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

在我的情况下,我在

中添加了日志语句
\Illuminate\Session\Middleware\StartSession::class

上面的中间件类针对给定的请求运行了两次,我不知道它为什么会运行两次,但我认为因此$errors变量正在重置。 我正在使用这种配置(我认为默认使用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,
];

我改变了对我有用的配置,$errors变量的计数不为零(上述中间件每次请求只运行一次)

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.php配置更改之前和之后,我的所有路由都在web中间件组中,我根本没有从web中间件组移动我的路由。

答案 8 :(得分:2)

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

答案 9 :(得分:0)

在这种情况下 laravel 5.2 您可以参考示例代码并编辑您的kernal.php文件。移动此\Illuminate\View\Middleware\ShareErrorsFromSession::class,将middlewareGroups移至middleware并将\Illuminate\Session\Middleware\StartSession::class添加至middleware 然后它的工作正常。

答案 10 :(得分:0)

在我们的应用程序中同时具有Web和API要求,我们不想移动中间件;也许那会奏效:

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

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

在所有实例中切换到数据库驱动程序解决了这个问题。