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()方法後(沒有錯誤信息,不跳轉),有點記不得了,回去了再補上用了啥