Laravel FormRequest перед проверкой

Я искал способ проверить некоторую логику перед проверкой formRequest, но ничего не нашел. Есть ли у него похожий хук, например after(), в методе withValidator или, может быть, в конструкторе?

МойКонтроллер:

class MyController extends Controller {
 public function myMethod(MyFormRequest $request) {
 //the request is validate before executing anything here
 }
}

MyFormRequest:

class MyFormRequest extends FormRequest
{
    protected $stopOnFirstFailure = true;

    public function rules(): array
    {

        return [
            'name' => 'integer',
            //etc
        ];
    }

    public function withValidator(Validator $validator): void
    {
      if ($this->request->model()->someValue < 100) {
       //throw validation error before the validation of the above rules
      } 
    }
}

Я не могу поместить проверку в обычный набор rules, потому что у меня нет этого атрибута в данных запроса, эта конкретная проверка относится к модели по запросу, что-то привязанное к сеансу (например, пользовательская модель), что мне нужно проверьте сначала, прежде чем что-либо еще, но я также не могу поместить его в метод authorization или промежуточное программное обеспечение, потому что это не проверка авторизации.

Я всегда могу добавить его в prepareForValidation, но тогда у меня будет атрибут в validatedData, который мне больше не нужен в потоке...

Вы можете использовать поставщика услуг, чтобы написать использование пользовательской логики, используя Validator::extend() в методе загрузки.

Coder 27.04.2023 11:24

дело в том, что пользовательское правило проверки из Validator::extend() все еще необходимо сопоставить с атрибутом входных данных запроса, но в моем случае у меня нет входного атрибута, а есть модель в пакете запросов, которую мне нужно проверить, проверьте фрагмент выше. .

Petru Lebada 27.04.2023 11:32
Стоит ли изучать 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 и хотите разрабатывать...
1
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Предложение 2: Если вы хотите, чтобы эта логика была в одном месте, попробуйте переопределить один из следующих методов (не уверен, какой из них вам нужен): validate, validateWithBag, validateResolved. Вы сделаете что-то вроде этого:

public function validate(array $rules, mixed $params)
{
    if ($this->request->model()->someValue < 100) {
       //throw validation error before the validation of the above rules
    } 

    parent::validate($rules, $params);
}

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

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

Я всегда могу добавить его в prepareForValidation, но тогда у меня будет атрибут в validatedData, который мне больше не нужен в потоке - НЕТ! Вам не нужно

Попробуй это. Это сработает и выдаст желаемую проверку.

public function prepareForValidation(): void
{
    if ($this->request->model()->someValue < 100) {
        throw ValidationException::withMessages([
            'custom_error' => 'Error Message goes here.',
        ]);
    }
}

Также есть функция под названием stopOnFirstFailure

protected $stopOnFirstFailure = true;

извините за поздний ответ, ваше предложение отлично работает для меня, спасибо

Petru Lebada 10.05.2023 13:27

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