夜雪天狼
学习笔记
技术博文
转载备份
心灵鸡汤
laravel中一言不合就踩到的坑
发布者:caijw
阅读量:61680
发布时间:2018-10-18 17:30:39
# 校验参数与获取参数 以下是一个较简单的action数据校验和获取数据的代码,原理也比较简单,但隐含着一个较为隐晦的设计问题 ```php $this->validate($request, [//校验 'id' => 'required|integer|min:1' ]); $data = [ 'id'=>$request->post('id') ]; ``` 查看$this->validate的代码就会发现,这个方法是对$request->all()进行校验,但后面进行数据获取时,却使用post()获取数据(注:简单说post()是all()的子集,下面会介绍$request的几个方法的区别) ```php public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = []) { $this->getValidationFactory() ->make($request->all(), $rules, $messages, $customAttributes) ->validate(); return $this->extractInputFromRules($request, $rules); } ``` 所以以上代码就会存在post等请求中会有可能出现id字段为必填,却通过了校验,但是$data['id']为null的情况 建议改为如下代码(并无标准规范,根据设计需求而定,只要避免出现校验数据集大于使用数据集的情况即可): ```php /** * 使用小技巧:Validator是一个门面,但无需use Illuminate\Support\Facades\Validator; * 只要使用\Validator即可使用这个门面,所有的门面都可以这样操作,这归功于laravel的别名,详见config('app.aliases') */ \Validator::make($this->request->post(), [ 'id' => 'required|integer|min:1' ])->validate(); $data = [ 'id' => $request->post('id') ]; ``` ## request的几个方法的区别 request是laravel框架提供的请求类,该类的一些方法可以获取到请求的值,常用的方法如下(了解这些方法的区别以便可以更好的使用它们): * query():获取get请求的参数 * post():获取post请求的参数 * input():获取所有 HTTP 请求输入项,即query()+post() * all():获取全部的http请求项,包括文件 * get():用于获取请求类的值,获取的顺序是attributes(是一个数组,可以由$request->set()赋值)>query(query()方法的数据)>request(post()方法的数据) # 选填字段默认值的问题 通常我们的程序中需要很多选填字段,而这些字段,在没有传入的时候,程序会赋予一个默认值,做法如下: ```php \Validator::make($this->request->query(), [ 'id' => 'nullable|integer|min:1' ])->validate(); $id = $request->query('id', 1); ``` 看起来似乎没有什么问题,当id这个字段不存在时,使用默认值1,可惜的是,laravel框架很认真的执行了id字段不存在的这个判断,而并不关心这个字段的值是什么(有兴趣的可以去看下源码,判断使用的是array_key_exists()) 而且laravel框架自带了全局中间件:空字符串转为null,所以当请求时,给了id字段,却没有给值时,上述代码$id的值为null而不是1,建议将其改为: ```php $id = $request->query('id') ?? 1; //或 $id = $request->query('id') ?: 1; ``` > ??和?:的区别想必大家都清楚,以上两种均可以避免默认值的小坑,且对于本示例而言,两者并无任何区别,而在实际项目中,还是要根据业务需求选择符合逻辑的代码 -separator-