Проверка Laravel 11, требующая одного элемента в массиве, должна быть одной из следующих:

Я использую проверку запроса формы и разрешаю создание транспортных средств в форме. Каждое транспортное средство имеет ссылку, которая может быть A, B, C или D. Однако в каждом запросе формы всегда должен быть один номер: «A». Других может быть сколько угодно.

Я не контролирую форму. Запросы поступают через API.

Мой массив правил в настоящее время содержит:

'form.vehicles' => 'required',
'form.vehicles.*.ref' => 'required|in:A,B,C,D

В настоящее время я использую следующий код:

if (! in_array('A', $this->input('form.vehicles.*.ref'))) {
  throw new HttpResponseException(response()->json(['MessageString' => 'Vehicle ref A is required'], 422));

Однако это означает, что messageBag не может быть отправлен в ответе из-за других проблем с проверкой.

Как вы проводите эту проверку? Это FormRequest, ручной валидатор или что-то еще? У вас должна быть возможность добавлять сообщения в Error MessageBage вместо выдачи исключения, но это зависит от вашего подхода, который вы здесь не показали. В качестве альтернативы вы можете определить собственное правило, которое проверяет form.vehicles на наличие записи, содержащей ref: 'A', и использовать его как 'form.vehicles' => ['required', new RefCheckRule()] или аналогичное.

Tim Lewis 02.05.2024 15:14

Спасибо за комментарий. Это делается с помощью FormRequest. Я воспользовался вашим предложением создать собственное правило, реализующее ValidationRule. $requiredVehicle = collect($value)->first(function ($vehicle) { return $vehicle['ref'] === 'A'; }); if ($requiredVehicle === null) { $fail('Vehicle A is required'); } Я не могу создать ответ, но этот комментарий меня устраивает.

Charlie 02.05.2024 16:38

Отличный! Рад слышать, что у вас это работает 🙂 У вас должна быть возможность опубликовать ответ ниже (насколько мне известно, в Stackoverflow нет никаких ограничений на публикацию самостоятельного ответа, даже при 1 репутации), но в конечном итоге это более важно для вам, чтобы ваш код работал. Ваше здоровье!

Tim Lewis 02.05.2024 18:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
505
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я использовал предложение Тима Льюиса о создании специального правила, реализующего ValidationRule:

namespace App\Rules;

use Illuminate\Contracts\Validation\ValidationRule;

class VehicleA implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $requiredVehicle = collect($value)->first(function ($vehicle) { 
            return $vehicle['ref'] === 'A';
        });  

        if ($requiredVehicle === null) { 
            $fail('Vehicle A is required'); 
        }
    }

Внутри моего запроса формы:

'form.vehicles' => [
    'required',
    new VehicleA,
],

Другие вопросы по теме