Проверка FromRequest для метода Get не работает -Laravel
Я выполняю проверку запроса с помощью метода FormRequest. Я использую метод GET. Все кажется правильным, но проверка не работает. Мой Контроллер
use App\Http\Requests\V1\Admin\Create\SubToTop\TheSubject\UpdateTheSubjectRequest;
use Illuminate\Http\Request;
public function store(TheSubjectStoreRequest $request)
{
return 'Hello';
}
Мой FormRequest
use Illuminate\Foundation\Http\FormRequest;
class ShowTheSubjectRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'subject_code' => 'required|exists:the_subjects,sub_x',
];
}
public function messages()
{
return [
'subject_code.required' => 'Required,Can\'t Be Empty',
'subject_code.exists' => 'Entry does\'t exist with us.Choose Correct'
];
}
Message
"message": "The given data was invalid.",
"errors": {
"subject_code": [
"Required,Can't Be Empty"
]
}
** Я где-то читал, что FormRequest не подходит для метода GET. Тогда как я могу проверить для GET (кроме традиционного метода)
Пожалуйста помоги
3 ответа
Вы не можете использовать проверку формы для запроса GET, потому что он проверяет тело запроса, а запросы GET не имеют тела. Чтобы проверить строку запроса (часть URL после?
), вам нужно использовать промежуточное программное обеспечение, которое прерывает запрос, когда что-то пойдет не так.
<?php
namespace App\Http\Middleware;
use Closure;
class ValidateSubjectCode
{
public function handle($request, Closure $next)
{
$subjectCode = $request->route()->param('subject_code');
//Your validation logic
return $next($request);
}
}
Поскольку эта проверка, вероятно, специфична для контроллера, вы также можете определить промежуточное ПО Closure в свой контроллер. __construct
public function __construct()
{
$this->middleware(function ($request, $next) {
$subjectCode = $request->route()->param('subject_code');
//Your validation logic
return $next($request);
}
Чтобы определить некоторые правила проверки параметров метода GET, вы можете использовать ->where('A' => '[0-9]+') в конце определения вашего маршрута на странице web.php.
Самый простой вариант — просто взять значения, которые вы хотите проверить, и объединить их с телом запроса. Просто добавьтеprepareForValidation()
метод кFormRequest
класс, который это делает.
В вопросе не говорится, является ли значение параметром маршрута (например,https://example.com/api/v1/subject_code_goes_here/foo
) или элемент строки запроса (например,https://example.com/api/v1/foo?subject_code=xxx
.)
В случае параметра маршрута это будет выглядеть так:
public function prepareForValidation(): void
{
$this->merge([
"subject_code" => $this->route()->parameter("subject_code");
]);
}
Элемент строки запроса будет выглядеть следующим образом:
public function prepareForValidation(): void
{
$this->merge([
"subject_code" => $this->query()->get("subject_code");
]);
}