Laravel 5.2验证错误

时间:2015-12-22 16:44:18

标签: laravel laravel-validation laravel-5.2

我在Laravel 5.2中验证时遇到了一些问题 当我尝试在这样的控制器中验证请求时

$this->validate($request, [
                'title' => 'required',
                'content.*.rate' => 'required',
            ]);

验证器捕获错误,但不将它们存储到会话中,所以当我尝试在模板中调用此代码时

 @if (isset($errors) && count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

Laravel抛出错误

Undefined variable: errors (View: /home/vagrant/Code/os.dev/resources/views/semantic/index.blade.php)

当我尝试使用此代码进行验证时

 $validator = Validator::make($request->all(), [
                'title' => 'required',
                'content.*.rate' => 'required'
            ]);

            if ($validator->fails()) {
                return redirect()
                    ->back()
                    ->withInput($request->all())
                    ->withErrors($validator, 'error');
            }

变量$ error在模板中也不可用,但如果我尝试在控制器中显示错误

   if ($validator->fails()) {
                dd($validator->errors()->all());
            }

显示错误但我无法从模板访问它们。

怎么了?

9 个答案:

答案 0 :(得分:49)

从Laravel 5.2.27开始更新

Laravel现在默认支持Web中间件,如您所见:source

换句话说,您不再需要围绕Web中间件组包装路由,因为它在RouteServiceProvider文件中为您完成。但是,如果您使用的是5.2.0和5.2.26之间的Laravel版本,请参阅以下方法:

以下仅适用于Laravel 5.2.0至5.2.26

如果没有看到您的routes.phpKernel.php文件,我怀疑这是正在发生的事情。

中间件的工作方式已从5.2和5.1发生变化。在5.1中,您将在app/Http/Kernel.php文件中看到此内容:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \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,
];

此数组是应用程序的全局HTTP中间件堆栈。换句话说,它们运行在每个请求上。请注意这个特定的中间件:Illuminate\View\Middleware\ShareErrorsFromSession。这是在每个请求上添加$errors变量的原因。

但是,在5.2中,事情已发生变化,以允许同一应用程序中的Web UI和API。现在,您将在同一个文件中看到这个:

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

全球中间件堆栈现在只检查维护。您现在有一个名为“web”的中间件组,其中包含大量先前的全局中间件。请记住,在同一个应用程序中同时允许Web UI和API。

那么我们如何获得$errors变量?

在您的路线文件中,您需要在“Web”中间件组中添加路由,以便您可以在每个请求中访问该$errors变量。像这样:

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

如果您不打算构建API,另一种选择是将“Web”中间件移动到全局中间件堆栈,如5.1中。

答案 1 :(得分:4)

尝试使用

return redirect()->back()
              ->withInput($request->all())
              ->withErrors($validator->errors()); // will return only the errors

答案 2 :(得分:3)

尝试替换:

->withErrors($validator, 'error');

使用:

->withErrors($validator);

答案 3 :(得分:2)

// Replace

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

// with 

Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
});

答案 4 :(得分:1)

我在laravel 5.2中有我的工作验证代码,就像这样

首先在模型中创建一个像这样的函数

在模型中,在

处添加此行代码

使用Illuminate \ Support \ Facades \ Validator;

<php get_header(); ?>

    <div id="content">

        <?php query_posts('post_type=post&post_status=publish&posts_per_page=10&paged='. get_query_var('paged')); ?>

    <?php if( have_posts() ): ?>

        <?php while( have_posts() ): the_post(); ?>

        <div id="post-<?php get_the_ID(); ?>" <?php post_class(); ?>>

            <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( array(200,220) ); ?></a>

                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>

                <span class="meta"><?php author_profile_avatar_link(48); ?> <strong><?php the_time('F jS, Y'); ?></strong> / <strong><?php the_author_link(); ?></strong> / <span class="comments"><?php comments_popup_link(__('0 comments','example'),__('1 comment','example'),__('% comments','example')); ?></span></span>

        <?php the_excerpt(__('Continue reading »','example')); ?>

            </div><!-- /#post-<?php get_the_ID(); ?> -->

        <?php endwhile; ?>

        <div class="navigation">
            <span class="newer"><?php previous_posts_link(__('« Newer','example')) ?></span> <span class="older"><?php next_posts_link(__('Older »','example')) ?></span>
        </div><!-- /.navigation -->

    <?php else: ?>

        <div id="post-404" class="noposts">

            <p><?php _e('None found.','example'); ?></p>

        </div><!-- /#post-404 -->

    <?php endif; wp_reset_query(); ?>

    </div><!-- /#content -->

<?php get_footer(); ?>

并在控制器中调用此函数来验证输入

使用Illuminate \ Support \ Facades \ Redirect;

public static function validate($input) {

            $rules = array(
                'title' => 'required',
                'content.*.rate' => 'required',
              );
            return Validator::make($input, $rules);
        }

现在来到模板部分

  $validate = ModelName::validate($inputs);
    if ($validate->passes()) {
          ///some code
     }else{
           return Redirect::to('Route/URL')
                            ->withErrors($validate)
                            ->withInput();
      }

以及最重要的事情,你必须像这样写

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

答案 5 :(得分:0)

将您的路由包裹在web中间件中,如下所示:

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

并在app\Http\Kernel.php移动\Illuminate\Session\Middleware\StartSession::classweb $middlewareGroups移至$middleware 希望它能解决你的问题。

答案 6 :(得分:0)

//这将有效

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

// Add your routes here
});

//以及这也有效

Route::post('location',array(
'as'=>'location',
'middlewareGroups'=>'web',
'uses'=>'myController@function'
));

答案 7 :(得分:0)

// Controller

  $this->validateWith([
      'title' => 'required',
      'content.*.rate' => 'required',
  ]);


// Blade Template

  @if ($errors->has('title'))
      <span class="error">
        <strong>{{ $errors->first('title') }}</strong>
      </span>
  @endif
  @if ($errors->has('anotherfied'))
      <span class="error">
        <strong>{{ $errors->first('anotherfied') }}</strong>
      </span>
  @endif

找到documentation

答案 8 :(得分:0)

Route::group(['middlewareGroups' => ['web']], function () {
    // Add your routes here
    Route::resource('/post', 'PostController');
});


public function store(Request $request){
   $this->validate($request, [
       //input field names
      'title' => 'required|max:20',
      'body' => 'required',
   ]);
}

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