【问题标题】:Change request input values from empty string to null in Laravel在 Laravel 中将请求输入值从空字符串更改为 null
【发布时间】:2016-12-09 07:01:06
【问题描述】:

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

dd($request->input())

//output
array:5 [▼
  "_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4"
  "param1" => "1"
  "param2" => "2"
  "param3" => ""
  "param4" => ""
]

由于前端限制see here,基本上当用户在创建表单中没有选择时会发生这种情况,我无法更改请求的形式,因此排除空字符串值被发送到服务器)

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

$book->authors()->attach($request->input('param1'));

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

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

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

有什么想法吗???

提前谢谢你

【问题讨论】:

    标签: database laravel httprequest jquery-select2


    【解决方案1】:

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

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

    对于 > 5.4 的版本,请参阅下面的答案或直接复制官方中间件。


    HTTP middleware provide a convenient mechanism for filtering HTTP requests entering your application.

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

    例子:

    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);
        }
    }
    
    Route::post('/users', function (Request $request) {
    
        dd($request->input());
    
    })->middleware(SanitizeMiddleware::class);
    

    【讨论】:

    • 感谢您,但是任何使用它的人都可能想明确检查完全有效的字符串 '0'。if ($value !== '0' && empty($value)) {
    【解决方案2】:

    话虽如此,您可以通过以下方式解决您的问题: 注释掉或将其放入 middilware 应用\Http\Kernel.php:

     protected $middleware = [
        
    
    
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    
    ];
    

    【讨论】:

      【解决方案3】:

      您不能在将项目添加到数据透视表之前检查一下吗?

      if(!empty($request->input('paramX'))){
          $book->authors()->attach($request->input('paramX'));
      }
      

      【讨论】:

      • 感谢您的回复,我对每个输入参数都使用if ($request->input('paramX') != "")。我要的是更“全局”,而不需要每次都为每个请求输入参数包含 if 语句。
      猜你喜欢
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2013-11-24
      相关资源
      最近更新 更多