如何忽略Laravel的ConvertEmptyStringsToNull中的特定属性?

时间:2017-09-15 16:59:59

标签: php laravel

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?somethingsomething === null
  • GET /somewhere?exemptionexemption === ''
  • GET /somewhere?everythingeverything === null

1 个答案:

答案 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中间件。

enter image description here 那你很高兴去!所有请求都通过您的自定义中间件!您可以根据需要在中间件上将其用于单个组(如果您不想将其应用于所有请求)

  

PS:我没有真正仔细检查TransformRequest类,但我认为它应该是安全的,因为无论如何它都应用于Kernel.php中默认配置中的所有请求