Ввод Laravel old() иногда возвращает массив

#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') в своих представлениях, где я специально ожидаю строк, не вмешиваясь в исходную функцию.