首页 > 解决方案 > Laravel old() 输入偶尔会返回一个数组

问题描述

我的错误跟踪器显示以下 Blade 行的一些例外情况:

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

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

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

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

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

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

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

标签: laravellaravel-blade

解决方案


我决定制作一个新功能,它是一个稍微修改过的版本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')在我特别期望字符串的视图中使用,而不会弄乱原始函数。


推荐阅读