经过大量的测试,我们去获取各类型表单的值 比如 text、password、radio 复选框 textara 还有 双标签中的text值,实际上,如果不填写console.log() 获取的值都是空字符串,但是打印出来在浏览器上是啥也没有。
这个是正常的,但是传给后端却变成了null ,其实前端传过去的就是空字符串,上图那样,只是后端一般 是java或者是php框架,对了进行处理,将空字串转换为null,这个在我们操作数据库是不方便的,为什么变成null,因为字符串是对象,空字符串就是空对象。
以php的laravel为例
框架源码中:
laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php
框架底层的代码意思,如果是空字符串那么就转换为null,所以这不是前端是否对参数序列化和特殊处理的问题,而是后端需要做的改变。
解决方法:
暴力一点,直接注释这行,直接返回$value 不要做处理;(慎用)
class ConvertEmptyStringsToNull extends TransformsRequest { /** * Transform the given value. * * @param string $key * @param mixed $value * @return mixed */ protected function transform($key, $value) { // return is_string($value) && $value === '' ? null : $value; return $value; } }
但是这样还是很暴力的,毕竟框架底层代码,非常不建议这样操作,则会个文件,在laravel全局中间件文件中,已经引入的,也就是改文件是通过注册全局中间件加载的,所以在全局中间件那边也可以注释掉中间件配置,一样有效果。
我们可以看到上面还有一个trimstrings 中间件 这个中间件也是处理字符串用的,只不过他用于去除字符串两边的空格。
2.解决这个方法还有其他办法:
自己针对传的字段这些修改器或者自己定义中间件也可以解决,或者是request validate 但是很多表单字段很多,所以真的很麻烦。所以冒个风险 注释了中间件,因为是对参数做处理嘛,在laravel5.1版本都没有这个功能,所以注释了应该问题不大。
3.php中有个方法,过滤参数中的值
<?php
function test_odd($var)
{
return($var & 1);
}
$a1=array("a","b",2,3,4);
print_r(array_filter($a1,"test_odd"));
?>
其实这应该是laravel规范数据做的处理而已。可能规范,但并不符合我们实际期望。若可以框架实现自我配置文件就更加好了,因为我们也不愿意动框架原生的东西。
在开发过程中发现前端的 input 内容为空时,保存到数据库中却变成了 null ,看了一下 Laravel 的文档,才发现 Laravel 默认启用了一个全局中间件: \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,顾名思义就是将空字符串转成 null ,我们关掉这个全局中间件就可以了。
在 app/Http/Kernel.php 文件中注释掉 ConvertEmptyStringsToNull 中间件即可。