Анонимный блейд-компонент — преобразование переменной слота в функцию приводит к array_key_exists(): первым аргументом должна быть либо строка, либо целое число

#laravel #laravel-blade

#laravel #laravel-blade

Вопрос:

Laravel 7.X

Я создал простой анонимный компонент блейда ввода, который включает вывод ошибки проверки. Это был перевод ранее работавшего шаблона.

Компонент выглядит следующим образом:

 <div class="form-group">
    <label for='{{$field}}'>{{$title}} @error($field) - <span class='text-danger'> {{ $message }} </span> @enderror </label>
    <input id='{{$field}}' name='{{$field}}' type="text" class='form-control{{ $errors->has($field) ? ' is-invalid' : '' }}' placeholder='{{$placeholder}}' {{$attributes}} value='{{ old($field, $value) }}' >
</div>
 

В представлении я делаю следующее:

 <x-input-validation autofocus onblur="validate()">
    <x-slot name="field">name</x-slot>
    <x-slot name="title">Name</x-slot>
    <x-slot name="placeholder">Add Name</x-slot>
    <x-slot name="value">{{$app->name}}</x-slot>
</x-input-validation>
 

Во время рендеринга я получаю следующее сообщение об ошибке:

 array_key_exists(): The first argument should be either a string or an integer (View: C:wamp64wwwDEresourcesviewscomponentsinput-validation.blade.php)
 

Проблема, по-видимому, связана с директивой @error($field) и старой функцией ($field, $value). Если я изменю их, чтобы удалить переменную $field , она будет отображаться.

Похоже, что он также работает без изменений, если нет ошибок проверки или если в сеансе не сохранены предыдущие значения. В этой ситуации он также отображается правильно.

После многих попыток, похоже, одним из лакомых кусочков является то, что переменная $field имеет тип HtmlString . Не уверен, отвлекающий маневр это или нет, но, учитывая, что он жалуется на тип, я предполагаю, что это источник проблемы.

Есть идеи, как мне исправить эту проблему? Я в тупике.

Спасибо!

Комментарии:

1. Я смог решить эту проблему, используя html_entity_decode($field) в каждой из функций @error, $error->has($field) и old($field, $value). Теперь он работает. Честно говоря, это не ожидалось.

Ответ №1:

Я решил эту проблему, используя html_entity_decode($field) в каждой из функций @error, $error->has($field) и old($field, $value).

Поскольку $field был экземпляром HtmlString , html_entity_decode возвращает строку, приемлемую для этих функций. В то время как $field содержит только символы, кроме преобразования типа, я не вижу других изменений в содержимом $field .

Новый компонент становится:

 <div class="form-group">
    <label for='{{$field}}'>{{$title}} @error(html_entity_decode($field)) - <span class='text-danger'> {{ $message }} </span> @enderror </label>
    <input id='{{$field}}' name='{{$field}}' type="text" class='form-control{{ $errors->has(html_entity_decode($field)) ? ' is-invalid' : '' }}' placeholder='{{$placeholder}}' {{$attributes}} value='{{ old(html_entity_decode($field), $value) }}' >
</div>
 

Это решает проблему. Я не могу не думать, что это скорее упущение, когда Laravel обрабатывает этот случай.