表单请求
经过上述处理,确实可以起到表单验证的功能,但是结果或许不是我们期望的,就拿输出的错误提示来说吧,我们一般需要的是中文。Laravel也考虑到了这点,所以给我们提供了表单请求。
注意事项
正式开始之前,我们需要变更下控制器的结构,上述是通过控制器的一个方法处理两种请求,但是这在使用表单请求的时候是行不通的,我们需要建立两个方法,分别处理GET和POST。
路由
Route::get('register', 'IndexController@register');
Route::post('registerStore','IndexController@registerStore');
控制器方法
public function register()
{
return view('home.index.register');
}
public function registerStore()
{
}
视图文件
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" action="{{url('registerStore')}}">
<p>username:<input type="text" name="username"/></p>
<p>password:<input type="password" name="password"/></p>
<p>{{ csrf_field() }}
<input type="submit" value="submit"></p>
</form>
新建表单请求
我们仍然通过artisan创建,命令如下。
php artisan make:request RegisterRequest
新建的表单请求文件会出现在app/Http/Requests文件夹下,具体内容如下。
表单请求文件
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
如何使用?
1.在rules中填入验证规则
表单请求文件
public function rules()
{
return [
'username'=>'bail|required|alpha_dash|min:6',
'password'=>'bail|required|alpha_dash|min:6',
];
}
2.控制器中引入表单请求
只需要use下,并且在需要使用该表单请求的方法中注入该类即可,其他无需任何操作。
控制器
use App\Http\Requests\RegisterRequest;
public function registerStore(RegisterRequest $request)
{
}
完成这两部就成功了吗?我们测试了一下,居然报错了。
HTTP状态码:403
This action is unauthorized.
或许你猜到了些什么,不错就跟我们刚才看到的表单请求文件中的authorize方法有关。
这个方法旨在验证用户是否有权限进行该请求,默认返回false,没有权限。如果我们需要进行权限判断,例如我们只需要某个URI具有该请求权限,我们就可以书写对应逻辑关系,满足条件的话返回true不满足,返回false。如果没有特别需求,可以直接返回true。
表单请求文件
public function authorize()
{
return true;
}
此时我们再次提交表单,是不是出现了跟表单验证(一)中同样的效果。但是我们控制器方法中却没有书写任何的代码,是不是更简单了。
设置中文提示
有些朋友可能会问,说了这么多,不还是没有提到开头说的中文提示的问题,不要着急,马上就来。
除了authorize和rules之外,我们还可以在该文件中添加新的方法messages,该方法就是用来改变提示信息的。
表单请求文件
public function messages()
{
return [
'username.required'=>'用户名必填',
];
}
return的是一个数组,数组的键名就是字段名“点”验证规则,键值就是对应的提示信息。例如username.required就是把字段名为username的字段和required的验证规则结合,当用户输入为空的时候,就会提示用户名必填的中文提示了,替换了原有的The username field is required的英文提示。
但是如果每个都这么改的话,确实有些浪费时间,有没有更简单的办法呢?其实也很简单,只需要再添加attributes方法,并跟messages相结合。
public function attributes()
{
return [
'username' => '用户名',
'password' => '密码',
];
}
public function messages()
{
return [
'required'=>':attribute必填',
'alpha_dash'=>':attribute输入的字符必须是数字,字母,-或者_',
'min'=>':attribute不少于:min个字符',
];
}
attributes方法用来设置提示中的字段名称,暂且假定你的messages没有设置,只设置了attributes,那么你的错误提示就会变为"The 用户名 field is required."。当然这也不是我们需要的结果,因此我们需要更改messages。但是如果是字段名点验证规则的改法,那么attributes就没有任何意义了。为了简化我们的设置,不再进行重复劳动,Laravel给我们提供了占位符:attribute,在提示信息中输入占位符,它会被验证字段的实际名称取代。除了属性占位符,还有其它占位符,例如:min,:max等等。