2015-03-04 4 views
1

Я понимаю, как проверять запросы по типу, указывая имя класса в методе контроллера. Однако для запросов 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.

ответ

0

Ваше утверждение, что документы говорят, что лучше всего проверять запросы AJAX в контроллере, просто неверно.

Если прокрутить bit further down from what you linked - вы увидите это в разделе FormValidation

Если проверка не пройдена, ответ редирект будет генерироваться для отправки пользователя обратно на прежнее место. Ошибки также будут мигать , чтобы они были доступны для отображения. Если запрос был запросом AJAX, ответ HTTP с кодом состояния 422 будет возвращен пользователю , включая JSON-представление ошибок проверки .

Другими словами - нет причин, по которым вы не можете сделать это в простом FormRequest и просто ваш код значительно. Он автоматически обработает тот факт, что это вызов AJAX и возвращает соответствующие ответы HTTP.

Я делаю это все время в своих приложениях L5 - он работает безупречно.

+2

Да, к сожалению, опция кросс-домена в моем аякс-запросе опускала опцию «X-Requested-With» в запросе, поэтому на сервере это выглядело как стандартный неаксиальный запрос. –

+0

@Laurence У меня есть аналогичный вопрос, но я думаю, мне нужно немного практического решения, можете ли вы взглянуть на мою тему: https://stackoverflow.com/questions/44780698/how-to-validate-x-editable-request -in-laravel-server-side –

+0

@PhilCross, если вы получили свою работу, можете ли вы помочь: https://stackoverflow.com/questions/44780698/how-to-validate-x-editable-request-in-laravel-server -боковая сторона –

2

Хорошо, так что, похоже, что есть 2 фактора.

  1. Причина была перенаправлять вместо ответа с JSON потому, что X-Requested-With поле не был установлен по просьбе AJAX. Эта оболочка AJAX для приложения была настроена для работы с запросами Cross Domain, которые, как представляется, вытесняют поле X-Requested-With, что делает конечный запрос неактивным для сервера, следовательно, перенаправление.

  2. Причина, по которой это не было устранение исключения Illuminate\Contracts\Validation\ValidationException, заключается в том, что это исключение не выбрасывается. Если вы откроете Illuminate\Foundation\Validation\ValidatesRequest.php и выполните поиск функции throwValidationException(), вместо этого она вместо этого наберет HttpResponseException. Я попытался поймать HttpResponseException, и он был пойман успешно - я предполагаю, что документация неверна.

Решение было либо удалить крест атрибуты домена на запрос Ajax, добавьте X-Requested-With заголовка вручную, в соответствии с answer in this post. Это заставит приложение увидеть, что это запрос AJAX.

И если вы хотите вручную поймать исключение, вам нужно поймать HttpResponseException, а не ValidationException.

+0

Имея тот же вопрос, но я новичок, так что я бы очень признателен, если вы могли бы показать, пожалуйста, рабочий пример, чтобы я мог лучше понять. – user3718908

1

Просто сообщите, что вы хотите, чтобы json в заголовке также исправил это. Laravel проверяет, является ли запрос ajax, если запрашивается json.

if ($this->ajax() || $this->wantsJson()) 
{ 
    return new JsonResponse($errors, 422); 
} 

Решение:

заголовка Добавить

Accept: приложения/JSON