Я понимаю, как проверять запросы по типу, указывая имя класса в методе контроллера. Однако для запросов Ajax, According to the documentation, я должен проверять данные в контроллере, потому что использование класса валидатора будет перенаправлять, а не отправлять ответ.Laravel Ajax validation
Основная часть я смотрю на это:
Если входящий запрос был запрос AJAX, не редирект не будет генерироваться. Вместо этого ответ HTTP с кодом состояния 422 будет , возвращенный браузеру, содержащему JSON-представление ошибок проверки.
Однако мой контроллер выглядит следующим образом:
public function update(App\Permission $permission, Request $request)
{
$this->validate($request, [
'permission_description' => 'required|string'
]);
...
}
И я не могу за жизнь мне получить это ответить JSON. В документации указано, что если он не работает, он выдает исключение Illuminate\Contracts\Validation\ValidationException
, но я не могу его уловить.
Всякий раз, когда он терпит неудачу, он всегда перенаправляет обратно на страницу редактирования. Очевидно, я не хочу этого, я хочу ответ json.
Я только что попробовал «вручную записать его» со всем $v = Validator::make($request->all(), ...);
, который действительно работает, но в чем смысл использования способа $this->validate()
, если он не работает?
Метод $this->validate()
просто не работает с AJAX, и я должен писать его длинный путь каждый раз? Я делаю что-то неправильно?!
Ниже то, что я пробовал:
public function update(App\Permission $permission, UpdatePermissionRequest $request)
{
/** Redirects rather than returns JSON if the validation fails **/
}
----------------------------------
public function update(App\Permission $permission, Request $request)
{
$this->validate($request, [
'permission_description' => 'required|string'
]);
/** AND I've also tried: **/
try {
$this->validate($request, ['permission_description' => 'required|string']);
} catch (\Illuminate\Contracts\Validation\ValidationException $e {
echo $e; /** Echoing for debug reasons **/
exit;
}
...
/** Still redirects the browser, even if it is an AJAX request **/
}
-----------------------------------------
use Validator;
...
public function update(App\Permission $permission, Request $request)
{
$v = Validator::make($request->all(), [
'permission_description' => 'required|string'
]);
if($v->fails())
{
return response()->json(['reply' => false]);
}
/** Works **/
}
UPDATE документация неверна. В нем указывается, что метод $this->validate()
выбрасывает Illuminate\Contracts\Validation\ValidationException
, но это не так. Он выбрасывает исключение Illuminate\Http\Exception\HttpResponseException
.
Да, к сожалению, опция кросс-домена в моем аякс-запросе опускала опцию «X-Requested-With» в запросе, поэтому на сервере это выглядело как стандартный неаксиальный запрос. –
@Laurence У меня есть аналогичный вопрос, но я думаю, мне нужно немного практического решения, можете ли вы взглянуть на мою тему: https://stackoverflow.com/questions/44780698/how-to-validate-x-editable-request -in-laravel-server-side –
@PhilCross, если вы получили свою работу, можете ли вы помочь: https://stackoverflow.com/questions/44780698/how-to-validate-x-editable-request-in-laravel-server -боковая сторона –