Laravel 的Validation非常强大有许多用法,这里给出链接方便查阅
这里有两份文档,Laravel英文文档和Laravel中文文档,虽然英文水平有限,但是时间充裕的情况下还是慢慢啃一啃英文文档。
自定义验证规则
Laravel的验证方法很多,但是由于我们业务的需求,并不能满足我们所有的需求。由于Laravel没有像验证email一样的规则验证手机号码(不同地方的电话号码当然也不相同),所以下面我们自定义一个验证手机号码的规则 ‘phone_number’。
由于只添加一个验证,所以在app/Providers/AppServiceProvider.php中定义,
use Illuminate\Support\Facades\Validator;
public function boot(){
Validator::extend('phone_number', function($attribute, $value, $parameters, $validator) {
if(preg_match("/^1[34578]\d{9}$/", $value)){
return true;
}
return false;
});
}
如果要自定义多个验证规则,最好写一个类文件引入在上述boot方法中。
现在我们给出这个验证的报错信息,文档中说明在验证语言包中添加验证消息,那我们在resoueces/lang/en/validation.php中如下位置添加报错信息,
'Phone number format is wrong.',
'accepted' => 'The :attribute must be accepted.',
......
这样就完成自定义验证规则了,可以自由使用了,例如
public function register(Request $request){
$this->validate($request[
'phone' => 'required|phone_number',
]);
}
表单请求验证( Form Request Validation )
由于在app/HTTP/Controller/UserController.php中有许多有关用户的function,这里打算使用表单请求验证提交过来的值,在命令行中键入
php artisan make:request UserValidation
会生成app/HTTP/Requests/UserValidation.php文件,在rules方法中完成验证逻辑
public function rules() {
return $rules = [
'user.name' => 'required',
'user.password' => 'required',
];
}
但是目前这里出现问题,由于传过来的是user数组,好像并不能验证到传过来的值,目前问题没有解决。
注:
上述问题已解决,是由于在app/HTTP/Requests/UserValidation.php文件中,另一个function中的返回值为false,所以得到的值永远是Forbidden。只需要改为return true即可,代码如下
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(){
//ci'chu
return true;
}
调用如下,
use App\Http\Requests\UsersValidation;
public function login(UserValidation $request){
//function
}
显示验证error massage
问题描述:做项目时使用前后端分离做项目,后端只给出接口,前端按接口完成页面。由于后端用Laravel框架,在用户登录的时候会验证前端提交过来的参数,验证通过了当然没有问题,若验证未通过,后端会直接报错,前端则不会收到返回值,也就不会有任何提示,这种情况如何解决?
此处引用一下大牛的博文,Vue.js——vue-resource全攻略。
其中解决问题的部分代码如下,
this.$http.get('/someUrl', [options]).then((response) => {
// 响应成功回调
}, (response) => {
// 响应错误回调
});
表单请求验证#
创建表单请求#
在更复杂的验证情境中,你可能会想要创建一个「表单请求( form request )」。表单请求是一个自定义的请求类,里面包含着验证逻辑。要创建一个表单请求类,可使用 Artisan 命令行命令 make:request:
php artisan make:request StoreBlogPost
新生成的类保存在 app/Http/Requests 目录下。如果这个目录不存在,那么将会在你运行 make:request 命令时创建出来。让我们添加一些验证规则到 rules 方法中:
/**
* 获取适用于请求的验证规则。
*
* @return array
*/
public function rules(){
return [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ];
}
怎样才能较好的运行验证规则呢?你所需要做的就是在控制器方法中利用类型提示传入请求。传入的请求会在控制器方法被调用前进行验证,意思就是说你不会因为验证逻辑而把控制器弄得一团糟:
/**
* 保存传入的博客文章。
*
* @param StoreBlogPost $request
* @return Response
*/
public function store(StoreBlogPost $request){
// 传入的请求是有效的...
}
如果验证失败,就会生成一个重定向响应把用户返回到先前的位置。这些错误会被闪存到 session,所以这些错误都可以被显示。如果进来的是 AJAX 请求的话,则会传回一个 HTTP 响应,其中包含了 422 状态码和验证错误的 JSON 数据。
授权表单请求#
表单的请求类内包含了 authorize
方法。在这个方法中,你可以确认用户是否真的通过了授权,以便更新指定数据。比方说,有一个用户想试图去更新一篇文章的评论,你能保证他确实是这篇评论的拥有者吗?具体代码如下:
/**
* 判断用户是否有权限做出此请求。
* * @return bool
*/
public function authorize(){
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}
由于所有的表单请求都是扩展于基础的 Laravel 请求类,所以我们可以使用 user
方法去获取当前认证登录的用户。同时请注意上述例子中对 route
方法的调用。这个方法授权你获取调用的路由规则中的 URI 参数,譬如下面例子中的 {comment}
参数:
Route::post('comment/{comment}');
如果 authorize 方法返回 false,则会自动返回一个 HTTP 响应,其中包含 403 状态码,而你的控制器方法也将不会被运行。
如果你打算在应用程序的其它部分处理授权逻辑,只需从 authorize 方法返回 true:
/**
* 判断用户是否有权限做出此请求。
*
* @return bool
*/
public function authorize(){
return true;
}