Я искал способ проверить некоторую логику перед проверкой 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()
все еще необходимо сопоставить с атрибутом входных данных запроса, но в моем случае у меня нет входного атрибута, а есть модель в пакете запросов, которую мне нужно проверить, проверьте фрагмент выше. .
Предложение 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;
извините за поздний ответ, ваше предложение отлично работает для меня, спасибо
Вы можете использовать поставщика услуг, чтобы написать использование пользовательской логики, используя
Validator::extend()
в методе загрузки.