#laravel #laravel-blade
#laravel #laravel-blade
Вопрос:
Мой баг-трекер показывает некоторые исключения для следующих блочных строк:
<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-адреса.
Одна из этих полезных нагрузок должна иметь вид amp;email[]=abcamp;email[]=def
или какой-либо другой синтаксис, который отправляет ввод электронной почты в виде массива. Похоже, что средство проверки входа в систему по умолчанию 'email' => 'required|string'
не фильтрует его, в итоге я получаю ошибку в представлении.
Я ищу простой способ избавиться от этого исключения, используя как можно меньше кода, поскольку это происходит во многих представлениях. Чего-то подобного было бы достаточно, но это немного запутанно, поскольку он 'email'
дважды извлекает ключ из сеанса:
{{ is_string(old('email')) ? old('email') : null }}
Поэтому приветствуются любые предложения по сокращению этого синтаксиса, предпочтительно такого, который не извлекает переменные сеанса дважды.
Комментарии:
1. вы также можете создать свою собственную функцию, которая делает это, и вызвать свою функцию, тогда это просто вызов функции, а не троичный
2. да, вы правы, я сделал элегантное решение, я добавлю его в качестве ответа.
Ответ №1:
Я решил создать новую функцию, которая представляет собой слегка измененную версию 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')
в своих представлениях, где я специально ожидаю строк, не вмешиваясь в исходную функцию.