Как проверить запрос с помощью пользовательского запроса формы без внедрения зависимостей

#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. Спасибо, это работает! ) Насколько я понимаю, свойства массива остаются в данных, даже если их нет в правилах.