学习笔记《Laravel: Validation》

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;
}

你可能感兴趣的:(学习笔记《Laravel: Validation》)