在Laravel中将请求输入值从空字符串更改为null

ira*_*ira 4 database httprequest laravel jquery-select2

在我的控制器中,我收到一个Illuminate\Http\Request请求,其中包含一些值等于空字符串的数据:

dd($request->input())

//output
array:5 [?
  "_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4"
  "param1" => "1"
  "param2" => "2"
  "param3" => ""
  "param4" => ""
]
Run Code Online (Sandbox Code Playgroud)

(基本上这种情况发生在用户由于前端限制而未在创建表单中进行选择时,请参阅此处,我无法更改请求的形式以便排除空字符串值被发送到服务器)

请求输入数据用于将关系附加到模型.例如:

$book->authors()->attach($request->input('param1'));
Run Code Online (Sandbox Code Playgroud)

问题是当输入值等于空字符串时"",上面的行会抛出一个QueryException,因为它试图添加一个等于""数据透视表的外键.

另一方面,我注意到如果该值null不是"",则该attach()方法不会被执行,因此,不会抛出异常,也不会更新数据库,这正是我想要的行为,当用户没有选择时输入表格.

我的问题是如何将请求值更改""null我的第一个想法是创建一个辅助函数,迭代请求输入数组并将""替换为null并在控制器中使用它但对我来说这似乎不是一个好主意,因为这不会阻止可能的不需要的验证错误,使用表单请求验证时.

有什么想法吗???

先感谢您

Jar*_*ala 7

注意:Laravel 5.4现在附带此功能

https://laravel.com/docs/5.4/requests#input-trimming-and-normalization

对于版本> 5.4,请参阅下面的答案或只是复制官方中间件.


HTTP中间件提供了一种方便的机制,用于过滤进入应用程序的HTTP请求.

制作一个中间件并将其分配给您希望它发生的路由或控制器的方法.

例:

class SanitizeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        foreach ($request->input() as $key => $value) {
            if (empty($value)) {
                $request->request->set($key, null);
            }
        }

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)
Route::post('/users', function (Request $request) {

    dd($request->input());

})->middleware(SanitizeMiddleware::class);
Run Code Online (Sandbox Code Playgroud)