代码之家  ›  专栏  ›  技术社区  ›  Inigo

为什么不能将输入请求中的空字符串直接保存到相应的会话变量中?

  •  0
  • Inigo  · 技术社区  · 4 年前

    我在控制器中接收到一些数据,希望能够存储在会话变量中。有些字段可能包含空字符串,这很好:我也想保存这些字段,就像它们一样。

    但问题是:

    if($request->has('foobar')){
        // yup, confirmed it's there
    }
    
    if($request->foobar == ''){
        // yup, confirmed it's an empty string
    }
    
    session()->put('foobar', $request->foobar); // Nope! session()->put() method apparently refuses to add a request variable like this if it's an empty string?
    session()->save();
    
    if(session()->has('foobar')){
        // nope, it ain't there.
    }
    
    // I have to use this dumb workaround instead:
    
    $my_foobar = $request->foobar;
    
    if($request->foobar == ''){
        $my_foobar = '';
    }
    
    session()->put('foobar', $my_foobar); // this actually works: it sets the session variable to an empty string as I want
    session()->save();
    
    if(session()->has('foobar')){
        // yes, now it's there. hooray. but why? 
    }
    

    如果我可以向会话添加一个空字符串,并且如果请求变量等于一个空字符串,那么为什么我不能直接添加它呢?有人能就这里发生的事情提出建议吗?谢谢这是使用Laravel 8。

    0 回复  |  直到 4 年前
        1
  •  2
  •   Inigo    4 年前

    好吧,事实证明--

    if($request->foobar == ''){
        // this passes
    }
    
    if($request->foobar === ''){
        // but this doesn't (note the strict '===' operator)
    }
    

    这是因为请求值实际上是 null :

    if(is_null($request->foobar)){
        // yes, passes
    }
    

    原因如下:Laravel 5.4+使用 ConvertEmptyStringsToNull 默认情况下使用中间件。请参阅内核。php:

    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // this one
    ];
    

    幸亏 this answer 为我指明了正确的方向。

    推荐文章