我在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());
}
显示错误但我无法从模板访问它们。
怎么了?
答案 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.php
或Kernel.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中有我的工作验证代码,就像这样
首先在模型中创建一个像这样的函数
<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(); ?>
并在控制器中调用此函数来验证输入
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::class
从web
$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
答案 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