2013-01-21 24 views
6

Tôi đã thiết lập bộ điều khiển có một số xác thực.Không thể truy cập các lỗi xác thực trong chế độ xem

public function attemptLogin() 
{ 
    $rules = array(
     'email'=>'required|email', 
     'password'=>'required' 
    ); 


    $validator = Validator::make(Input::all() , $rules); 
    if($validator->fails()){ 
     return Redirect::to('login')->withErrors($validator); 
    }; 
} 

Nếu tôi ra những thông điệp trực tiếp trong bộ điều khiển

$messages = $validator->messages(); 
print_R($messages->all()); 

tôi nhận được lỗi xác nhận - tuy nhiên nếu tôi chuyển hướng:

return Redirect::to('login')->withErrors($validator); 

Các $errors mảng có sẵn trong giao diện luôn luôn là sắp trống rỗng.

+0

Laravel 4 vẫn đang trong BETA - vì vậy tôi khuyên bạn nên truy cập vào www.Laravel.io – diagonalbatman

Trả lời

8

Từ laravel four documentation

Lưu ý rằng khi xác nhận thất bại, chúng tôi vượt qua cá thể Trình xác thực cho việc chuyển hướng bằng cách sử dụng phương thức withErrors. Phương pháp này sẽ báo lỗi cho các thông báo lỗi đến phiên để chúng có sẵn theo yêu cầu tiếp theo.

Biến số $errors không phải là mảng.

Biến số $errors sẽ là phiên bản MessageBag.

Vì lý do nào đó tôi không thực sự thích ý tưởng @seamlss. Thay vào đó, bạn có thể sử dụng số này.

@if(Session::has('errors')) 
<? $errors = Session::get('errors'); ?> 
<div class="alert alert-error"> 
    <button type="button" class="close" data-dismiss="alert">&times;</button> 
    <ul> 
     <li id="form-errors" > 
      <h3> {{ $errors->first('email') }}</h3> 
     </li> 
    </ul> 
</div> 
@endif 

Tôi đã sử dụng một số bootstrap thành phần, không bị lẫn lộn, điều duy nhất bạn cần là các dòng với các dấu ngoặc nhọn và dấu @ huyền diệu.

Từ laravel docs error-messages-and-views

Vì vậy, điều quan trọng cần lưu ý là một $ lỗi biến sẽ luôn luôn được có sẵn trong tất cả các quan điểm của bạn, trên tất cả các yêu cầu, cho phép bạn thuận tiện đảm nhận $ lỗi biến luôn được xác định và có thể được sử dụng an toàn .

Bạn cũng có thể kiểm tra this

@if($errors->has('email')) 
    <div class="control-group error"> 
     <label class="control-label" for="email">Email</label> 
     <div class="controls"> 
      <input type="text" id="email" placeholder="Email" name="email"> 
      <span class="help-inline">{{ $errors->first('email') }}</span> 
     </div> 
    </div> 
@endif 
+0

@ FMaz008 Tại sao bạn cho rằng đây không phải là cú pháp 'lưỡi'? –

0

Các bạn đã thử:

return Redirect::to('login')->withErrors($validator); 

hoặc

return Redirect::to('login')->withErrors($validator->messages()); 
+0

Tôi đã thử điều đó - có vẻ như không hữu ích. – PokeItWithAStick

-1

Hãy thử như sau

return Redirect::to('login')->with('errors',$validator->errors->all()); 

sau đó từ vòng xem của bạn thông qua lỗi này

foreach($errors as $error) { 
    print $error; 
} 
5

Tôi đã thành công chuyển hướng sử dụng ->withErrors($validation)

Và sau đó trong giao diện kiểm tra các điều kiện @if($errors->count() > 0) ...

@if($errors->count() > 0) 
    <p>The following errors have occurred:</p> 

    <ul id="form-errors"> 
     {{ $errors->first('username', '<li>:message</li>') }} 
     {{ $errors->first('password', '<li>:message</li>') }} 
     {{ $errors->first('password_confirmation', '<li>:message</li>') }} 
    </ul> 
@endif 
0

Đây là một khả năng khác khi bạn gặp khó khăn hiển thị lỗi, và khi họ được thông qua một cách chính xác thông qua ->withErrors(). Nếu bạn chuyển hướng đến một hành động điều khiển mà phải thực hiện bất kỳ loại kiểm tra trạng thái riêng của mình và chính nó gọi ->withErrors(), nó sẽ bóng đầu tiên $errors tiêm.

Các vấn đề liên quan