laravel - 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 }}
因此,欢迎提出任何缩短此语法的建议,最好是不检索会话变量两次的建议。
解决方案
我决定制作一个新功能,它是一个稍微修改过的版本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')
在我特别期望字符串的视图中使用,而不会弄乱原始函数。
推荐阅读
- in-app-purchase - 如何实施应用内购买以禁用 TWA 中的广告
- javascript - 当 aot 设置为 true 时,ngClass 和 ngIf 条件编译失败
- macos - 自定义 Mac 终端命令 Control+w
- python - Numpy:了解 Array 的强大功能
- docker - 代理关闭时 ActiveMQ 过时的客户端连接
- python - 使用 pandas (error_bad_lines) 读取 csv 时获取坏行/错误的数量
- python - 使用气流任务将数据从 redshift 卸载到 s3
- apache-kafka - @KafkaKey 注释用于什么
- node.js - 如何在 aws codeDeploy 后自动重启节点应用程序
- c# - 防止浏览器窗口进入前台