Пользовательское сообщение об ошибке Laravel из пользовательской функции валидатора с использованием $validator->errors->add()

У меня есть пользовательское правило проверки appointment_status. Я выполняю на нем различные тестовые примеры и решаю, какое сообщение об ошибке лучше всего и возврат. это будет по-разному для каждого case. Я хочу, чтобы $validator->errors()->add('status', __('Invalid status for an appointment in past') установил сообщение об ошибке, и оно добавляется. но он не возвращается обратно к контроллеру. Я не могу получить доступ к этому сообщению в любом месте. он показывает только тот status.appointment_status, который установлен в функции messages().

Пользовательский класс запроса:

namespace Modules\ShopManager\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AppointmentsRequest extends FormRequest
{

    public function __construct()
    {
        \Validator::extend('appointment_status', 'Modules\ShopManager\Validators\CustomValidator@appointmentStatus');

    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'services' => 'required',
            'sdate' => 'required|date_format:m-d-Y|time_range:sTime,edate,eTime,timezone',
            'edate' => 'required|date_format:m-d-Y|workinghours_range:sdate,sTime,edate,eTime,timezone',
            'sTime' => 'required|date_format:h:i a',
            'eTime' => 'required|date_format:h:i a',
            'cname' => 'required',
            'cphone' => 'required_without:cemail',
            'cemail' => 'nullable|required_without:cphone|email',
            'timezone' => 'required',
            'status' => 'required|appointment_status:sdate,sTime,edate,eTime,timezone',
        ];


        return $rules;

    }

    public function messages()
    {
        return [
            'status.appointment_status' => 'Invalid status'
        ];
    }

    public function attributes()
    {
        return [
            'services' => 'Services',
            'date' => 'Date',
            'sTime' => 'Start Time',
            'eTime' => 'End Time',
            'cname' => 'Customer name',
            'cphone' => 'Customer phone',
            'cemail' => 'Customer email',
            'internal_note' => 'Internal note',
            'status' => 'Status',
        ];
    }

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
}

Пользовательская функция валидатора:

public function appointmentStatus($attribute, $value, $parameters, $validator)
    {
        $dateTimeOperations = new DateTimeOperations;

        $sdate = array_get($validator->getData(), $parameters[0]);
        $startTime = array_get($validator->getData(), $parameters[1]);
        $edate = array_get($validator->getData(), $parameters[2]);
        $endTime = array_get($validator->getData(), $parameters[3]);
        $timezone = array_get($validator->getData(), $parameters[4]);

        $now = $dateTimeOperations->getNow($timezone);
        $start = $dateTimeOperations->getTimestamp($sdate, $startTime, $timezone);
        $end = $dateTimeOperations->getTimestamp($edate, $endTime, $timezone);

        switch ($value) {
            case constants('appointments.status.pendig'):
                $start->lessThan($now)
                ? $validator->errors()->add('status', __('Invalid status for an appointment in past'))                
                : '';
        }

        return $validator->errors()->any();
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
295
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Добавление ошибки просто в поле без указания правила думаю не сработает, поэтому сообщение из запроса на валидацию имеет приоритет.

Поэтому измените его на это:

$validator->errors()->add('status.appointment_status', __('Invalid status for an appointment in past'))

А еще в вашем случае может быть опечатка: pendig быть pending?

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

$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
});

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