#php #laravel #laravel-8
Вопрос:
Я проверяю запросы с помощью FormRequest. Это отличный инструмент, но я столкнулся с проблемой. Создавая стандартные идентичные методы для контроллеров, я решил поместить эти методы в базовый абстрактный класс. Но в этом случае я не могу проверять запросы с помощью FormRequest, так как они передаются с помощью DI. Я нашел следующее решение, которое частично решило эту проблему:
/** @var FormRequest $customForRequest */
$customForRequest = $requestModel::createFrom($this->request);
return Validator::make($this->request->all(), $customForRequest->rules())->validate();
Но метод withValidator, который в стандартном сценарии работает как последующий хук, в этой ситуации не вызывается. Как можно принудительно выполнить этот метод, оставив логику проверки в отдельном классе?
Моя форма запроса:
class MassUpdateDocumentAttribute extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'filter' => 'required|array',
'filter.id.*' => [
'sometimes',
'integer',
Rule::exists(DocumentAttribute::class, 'id')
],
'fields' => 'required|array',
'fields.document_id' => [
'sometimes',
Rule::exists(Document::class, 'id'),
],
'fields.document_attr_type_id' => [
'required_with:fields.value',
Rule::exists(DocumentAttrType::class, 'id'),
],
'fields.value' => [
'sometimes',
'bail',
]
];
}
public function withValidator(Validator $validator)
{
if ($validator->fails()) return;
$validator->after(function ($validator) use ($documentAttributeRepository, $documentAttrTypeRepository) {
$data = $validator->getData();
// some large logic
});
}
}
Комментарии:
1. Вы пробовали
app(YourRequest::class)
, это также должно автоматически подтверждаться.2.Это решение-работа! Но как я могу получить только проверенные данные? Я попробовал сделать это так:
app($requestModel);
$customForRequest = $requestModel::createFrom($this->request);
return Validator::make($this->request->all(), $customForRequest->rules())->validate();
но я получил все данные запроса. Обычно я не получаю поля, если поля не существуют в правилах3. Я добавил к ответу.
4. Спасибо! Ответ работает!
Ответ №1:
Вы должны иметь возможность создать экземпляр своего класса FormRequest, просто вызвав app(YourRequest::class)
его внутри метода. Он будет автоматически подтвержден. Таким образом, вы можете просто передать YourRequest::class
деталь в качестве переменной в нужный запрос формы, и все это должно работать.
$request = app(YourRequest::class);
$data = $request->validated();
Комментарии:
1. Спасибо, это работает! ) Насколько я понимаю, свойства массива остаются в данных, даже если их нет в правилах.