2015-05-25 4 views
0

Я слишком много newb, чтобы выяснить, как правильно отслеживать это, поэтому надеемся, что кто-то здесь может мне помочь.Laravel 5 Validation Not Catching Errors

Валидатор больше не работает в моем приложении Laravel 5. Он не ломает ошибок. Все проходит. Я сузил мой код так, что я делаю простой кубик и сваливать на валидатор на форме представления, например, так:

public function postRegister(Request $request){ 
    $validator = $this->registrar->validator($request->all()); 
    dd($validator); 
} 

Метод Регистратор валидатор:

public function validator(array $data) 
{ 
    return Validator::make($data, [ 
     'username' => array('required, regex:/^[a-zA-Z0-9\-\s]+$/, max:20'), 
     'email'  => 'required|email|max:255|unique:users', 
     'password' => 'required|confirmed|min:6', 
     'honeyfield' => 'size:0', 
     'unhuman' => 'boolean:0', 
     'honeytime' => 'honeytimer:7' 
    ]); 
} 

(«honeytimer '- это специальная проверка, настроенная с помощью поставщика услуг Validator).

Теперь, если я отправлю заполненную ошибкой форму, я возвращаю объект Validator со всеми определенными правилами, но пустым массивом #failedRules, и если я умру и дамп $ request, мешок с ошибкой отсутствует.

Если я умру и сбрасываю $ validtor-> fail(), он возвращает true, но когда я пытаюсь получить массив с помощью $ validator-> failed(), он пуст.

Взяв дополнительную информацию (с особой благодарностью @shaddy за помощь в ее устранении), регулярный метод (ниже) сначала проверяет, не прошла ли проверка, но она, похоже, не регистрирует ее, потому что он просто продолжается и пытается создать пользователя в любом случае.

public function postRegister(Request $request) 
{ 
    $validator = $this->registrar->validator($request->all()); 

    if($validator->fails()) { 
     $this->throwValidationException(
      $request, $validator 
     ); 
    } 

    $this->auth->login($this->registrar->create($request->all())); 

    \Session::flash('new_registration', true); 

    return redirect()->intended('/'); 
} 

Все это работало правильно, когда оно было впервые реализовано. Таким образом, это явно некоторые изменения, которые я сделал за последние пару дней в какой-то другой части приложения, которая вызывает это. Естественно, я тестировал все, что мог придумать (с точки зрения изменений, которые я сделал), но ничего, похоже, не имеет никакого значения.

Может ли это иметь какое-то отношение к порядку, в котором загружаются классы? Что мне здесь не хватает? Я уверен, что это нечто очевидное, но я действительно мог бы использовать некоторые советы. Заранее спасибо.

+0

См. Мой ответ [здесь] (http://stackoverflow.com/questions/30430983/laravel-5-construct-argument-passing-error/30431217#30431217) – shaddy

+0

Спасибо @shaddy, но я пытаюсь выяснить почему валидатор не работает в первую очередь. Я знаю о запросах формы, но это еще один способ управления проверкой. Он не решает проблему недействительной валидатора (которая отличается от проблемы в указанном вами вопросе). Однако я ценю вход. Еще раз спасибо. :-) – DonnaJo

ответ

1

Вы должны иметь что-то вроде

array('required', 'regex:...') 

вместо

array('required, regex...') 

, который не имеет никакого смысла. Каждое из правил проверки должно быть ограничено конвейерами или быть единственным столбцом в массиве.

0

Неисправный массив пуст, потому что вы просто создаете новый экземпляр валидатора. Фактически вы не инициируете проверку.

Таким образом, вы можете сделать это, чтобы вызвать проверку и проверить, если он не:

public function postRegister(Request $request){ 
    $validator = $this->registrar->validator($request->all()); 
    dd($validator->fails()); 
} 

Вы также можете получить доступ к массив неудачных правил проверки, без сообщений. Для этого используйте неисправный метод:

$failed = $validator->failed(); 

Вы можете посмотреть больше примеров в documentation.

EDIT:

Теперь после того, как я вижу, ты весь код, я могу сказать, что вам нужно, чтобы справиться с ситуацией, в которой у вас есть ошибки:

public function postRegister(Request $request) 
{ 
    $validator = $this->registrar->validator($request->all()); 

    if($validator->fails()) { 
     // Validator fails, return to the previous page with the errors 
     return Redirect::back()->withInput()->withErrors($validator); 
    } 

    $this->auth->login($this->registrar->create($request->all())); 

    \Session::flash('new_registration', true); 

    return redirect()->intended('/'); 
} 
+0

Я должен был упомянуть, что я уже пробовал $ validator-> failed(). Я сделаю редактирование на вопрос. Интересно то, что $ validator-> fail() возвращает true, когда я dd(), но не получает его в обычном методе postRegister(). (Я сделаю изменения выше с более подробной информацией). Еще раз, спасибо, @shaddy. Я ценю помощь. :-) – DonnaJo

+0

@ DonnaJo, что произойдет, если вы сделаете это 'if ($ validator-> fail()) die ('test');' в вашем методе postRegister? – shaddy

+0

Мне кажется, что валидатор работает, вы просто неправильно обрабатываете ошибки проверки. Можете ли вы вставить весь код после проверки на erros? :) – shaddy

0

после проверки вам нужно, чтобы поймать ошибку проверки сообщение

if ($validator->fails()): 
     return $validator->messages()->first(); 
0

Спасибо всем за помощь!Для всех, кто сталкивается с этим в будущем, оказывается, что размещение правила регулярного выражения в массиве, как это было предложено (хотя и не обязательно) в документе Laravel 5 здесь: http://laravel.com/docs/5.0/validation#rule-regex, было - в моем случае - виновником. Изменение его обратно в разделители труб решило проблему.

Таким образом, изменение:

'username' => array('required, regex:/^[a-zA-Z0-9\-\s]+$/, max:20') 

к ...

'username' => 'required|regex:/^[a-zA-Z0-9\-\s]+$/|max:20' 

... вызвал проверку для правильной работы. Возможно, что у меня не было настроенного массива, конечно. Если это так, ввод оценивается. В любом случае, разграничение труб сделало трюк.

EDIT:

@ Codel96 прибивают это в своем ответе. Во-первых, я не настроил массив.