1、首先说以下写这篇文章的初衷,在自己和同事一起写项目的时候遇到了表单验证的一个bug,在已经写了表单验证的情况下后面再次验证手机号是否符合规则,执行
return back()->withErrors('手机号不合法');
虽然确定是没有成功创建数据,但是“手机号不合法”的报错信息也没有展示出来,所以决定好好研究下其中的问题;
2、本地我创建了一个电影表
CREATE TABLE `movies` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`director` int(10) unsigned NOT NULL,
`describe` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`rate` tinyint unsigned NOT NULL,
`released` enum('0', '1'),
`release_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
创建了movie的路由
//电影控制器
Route::group(['prefix'=>'movie'],function($router) {
$router->get('', 'MovieController@index');//展示创建的结果列表,
$router->get('/add', 'MovieController@add');//新增表单页面
$router->post('/add', 'MovieController@addDeal');//处理新增表单页面的逻辑
});
创建控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class MovieController extends Controller
{
public function index()
{
return view('movie.index');
}
public function add(){
return view('movie.add');
}
public function addDeal(Request $request){
$this->validate($request,[
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
}
}
创建add视图,movie/add.blade.php,视图是从之前laravel文档上抄下来的,不想多费时间在前端上面
@extends('layouts.app')
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">新增电影</div>
<div class="panel-body">
<form class="form-horizontal" role="form" method="POST" action="{{ url('/movie/add') }}">
{{ csrf_field() }}
<div class="form-group{{ $errors->has('title') ? ' has-error' : '' }}">
<label for="title" class="col-md-4 control-label">标题</label>
<div class="col-md-6">
<input id="title" type="text" class="form-control" name="title" value="{{ old('title') }}" placeholder="电影标题">
@if ($errors->has('title'))
<span class="help-block">
<strong>{{ $errors->first('title') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
<i class="fa fa-btn fa-user"></i> 提交
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
页面效果
点击提交后报第一个错误
原因:之前的验证逻辑里面写了unique,默认会去查表里面的数据是否已存在,如果已存在,报错;posts是写在unique后的表名,改为movies之后就ok了
确实没有传body字段报的错;
接下来验证如果传的内容有两个部分错误,以及在执行过$this->validate()方法后为什么执行不成功return back()->withErrors('测试错误信息');
1、展示错误方面,根据验证规则,出现多少错误就会返回多少错误;我在表里面增加了一个title为123的数据,再次执行,报了两行错;第一行是title重复的意思,第二行缺少body字段;然后表单中输入框和标签变红,输入框中保留之前的输入值,下面新增了一行提示文字,也就是头部的第一行;具体怎么实现的请看add.blade.php视图文件;
当validate()方法执行时,会将错误信息闪存flash到session中(当前项目/storage/framwork/sessions下没有找到,由于是只在下一次的请求内有效,找不到),报错信息和旧的输入信息都是放到了闪存里面,我打印出来的数据结构如下:
2、对于错误信息,因为是全英文来的有点不符合我们查看;我们有两种方式可以解决;
- 修改resources/lang/validation.php中对应的数据
- 修改resources/lang/validation.php中customer中的数据
3、处理文章上最先提出的问题:在执行validate()方法后(没有错误信息,不跳转),有点记不得了,回去了再补上用了啥