Laravel包含一个名为ConvertEmptyStringsToNull
使用中间件,GET /somewhere?something
的请求会产生something === null
如果没有中间件,此请求会生成something === ''
如何针对特定属性名称禁用它?
例如,如果您查看另一个全局包含的中间件TrimStrings
,您会发现它包含except
属性。
/**
* The attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
//
];
在这种情况下,中间件将应用于除此处命名的属性之外的每个属性。我尝试以相同的方式扩展ConvertEmptyStringsToNull
,但它不起作用。我觉得我错过了一些基本的东西。
我希望能够为此中间件添加例外,以便仅为特定属性名称获取空字符串。例如除了exemption
GET /somewhere?something
:something === null
GET /somewhere?exemption
:exemption === ''
GET /somewhere?everything
:everything === null
答案 0 :(得分:0)
实际上,您可以将TransformsRequest
类扩展为自定义中间件(因为ConvertEmptyStringsToNull
也扩展了同一个类)然后根据您的需要覆盖transform()
方法。一个工作示例如下
我将请求字段'abc'排除在设置为null 之外。抱歉 unclean 示例,我使用了一个数组,所以我想要排除多个字段。
//this is a middleware class I have removed `handle()` function leaving the default.
class NinjaAuther extends TransformsRequest
{
/**
* Transform the given value.
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function transform($key, $value)
{
if(is_string($value) && !in_array($key, ['abc'], true)) {
$value = $value === '' ? null : $value;
}
return $value;
}
}
从ConvertEmptyStringsToNull
移除$middleware
中间件,然后包含您自己的NinjaAuther中间件。
那你很高兴去!所有请求都通过您的自定义中间件!您可以根据需要在中间件上将其用于单个组(如果您不想将其应用于所有请求)
PS:我没有真正仔细检查TransformRequest类,但我认为它应该是安全的,因为无论如何它都应用于Kernel.php中默认配置中的所有请求