Laravel old() 输入偶尔会返回一个数组



我的错误跟踪器显示以下刀片行的一些异常:

<input
type="email"
id="email"
name="email"
value="{{ old('email') }}"
>
htmlspecialchars() expects parameter 1 to be string, array given

这是由old()帮助程序引起的,该帮助程序以某种方式检索'email'数组而不是字符串。

现在,通常,当使用此输入提交表单时,当控制器重定向回以进行验证时,old('email')值应仅包含一个字符串。但是,我注意到我的应用程序上运行了一些黑客脚本,它们试图通过发送特定的 POST 有效负载并尝试 url 来破坏东西。

其中一个有效负载必须是&email[]=abc&email[]=def的形式或将电子邮件输入作为数组发送的其他语法。默认登录验证器'email' => 'required|string'似乎没有过滤它,最后我最终在视图中出现错误。

我正在寻找一种简单的方法来用尽可能少的代码摆脱此异常,因为这发生在许多视图中。这样的事情就足够了,但它有点复杂,因为它从会话中检索了两次'email'密钥:

{{ is_string(old('email')) ? old('email') : null }}

因此,欢迎任何建议来缩短此语法,最好是不检索会话变量两次的语法。

编辑required|string验证似乎只允许字符串,因此您无法发送数组。但是,当此 ValidationException 发送到视图时,将发生实际错误,而视图又调用old('email'),该视图将返回传递的任何内容(在这种情况下,即使数组无效)。

我决定做一个稍微修改old()的函数:

// app/helpers.php

if (!function_exists('old_string')) {
/**
* Wrapper for `old()` helper that doesn't break when arrays manage to get in.
* @param string $key
* @param mixed $default
* @return string|null
*/
function old_string($key, $default = null)
{
$val = old($key, $default);
return is_string($val) ? $val : null;
}
}

这样,我可以在我的视图中使用old_string('email'),我特别需要字符串,而不会弄乱原始函数。

如果旧函数返回空数组,这意味着您将 null 作为 attr 传递

最新更新