2015-06-26 7 views
22

Jak mogę przekierować z powrotem do strony formularza z podanymi parametrami POST, jeśli moja akcja formularza zgłasza wyjątek?Jak przekierować z powrotem do formularza za pomocą danych wejściowych - Laravel 5

+1

Wiesz, że musiałem odpowiedzieć na twoje pytanie tylko dlatego, że poprosiłeś i odpowiedziałeś na nie w tym samym czasie. – whoacowboy

+0

Pomyślałem, że byłoby to pomocne dla innych ludzi.Nie mogłem znaleźć rozwiązania, więc przekopałem się przez źródło, aby zobaczyć, jak jest ono obsługiwane za pomocą Form Validation automatycznie. – infomaniac

+0

Zawsze to doceniam. – whoacowboy

Odpowiedz

31

można użyć następujących:

return Redirect::back()->withInput(Input::all()); 

Jeśli używasz Form Request Validation, to jest dokładnie jak laravel przekieruje Cię z powrotem z błędami i danego wejścia.

Fragment \Illuminate\Foundation\Validation\ValidatesRequests:

return redirect()->to($this->getRedirectUrl()) 
        ->withInput($request->input()) 
        ->withErrors($errors, $this->errorBag()); 
+0

Możesz także użyć 'back()'. http://laravel.com/docs/5.1/responses#redirects – lesssugar

+1

Nie, to nie obsługuje twoich parametrów wejściowych. – infomaniac

+3

Jasne, mówię to: 'return redirect() -> back() -> withInput();' It's tylko poręczne makro. – lesssugar

22

pisać starą funkcję na swoich polach cenią np

<input type="text" name="username" value="{{ old('username') }}"> 
+0

Ten działa dla Laravel 5.1 – TodStoychev

+1

Dzięki! Używam Laravel 5.2 i to działa również dla mnie. Oprócz funkcji 'old()' w naszym szablonie blade, musimy również użyć 'withInput()' w naszym kontrolerze, aby to działało. Podobnie jak => 'if ($ validate-> failed()) return redirect (" somepage ") -> withErrors ($ validate) -> withInput();' –

+2

Każdy pomysł jak to zrobić dla 'select ' –

2

obsłużyć wyjątki walidacji w laravel 5.3 jak ten. Jeśli użyjesz Laravel Collective, automatycznie wyświetli się błędy obok danych wejściowych, a jeśli użyjesz laracast/flash, pokażesz jako pierwszy komunikat o walidacji.


Handler.php render:

public function render($request, Exception $e) 
{ 
    if ($e instanceof \Illuminate\Validation\ValidationException) { 
     return $this->handleValidationException($request, $e); 
    } 

    (..) 
} 

a funkcja:

protected function handleValidationException($request, $e) 
    { 
     $errors = @$e->validator->errors()->toArray(); 
     $message = null; 
     if (count($errors)) { 
      $firstKey = array_keys($errors)[0]; 
      $message = @$e->validator->errors()->get($firstKey)[0]; 
      if (strlen($message) == 0) { 
       $message = "An error has occurred when trying to register"; 
      } 
     } 

     if ($message == null) { 
      $message = "An unknown error has occured"; 
     } 

     \Flash::error($message); 

     return \Illuminate\Support\Facades\Redirect::back()->withErrors($e->validator)->withInput(); 
    } 
1

laravel 5:

return redirect(...)->withInput(); 

do tyłu tylko:

return back()->withInput(); 
+1

' return back() -> withInput(); ' –

+0

Nice! Przekazałem' $ request-> all() 'do ta metoda, ale dobrze jest wiedzieć, że to nie jest konieczne –

4

W kodzie HTML należy użyć value = {{ old('') }}. Bez użycia tego nie można odzyskać wartości, ponieważ sesja będzie przechowywana w pamięci podręcznej.

Podobnie jak w przypadku walidacji nazwa, to być-

<input type="text" name="name" value="{{ old('name') }}" /> 

Teraz można uzyskać wartość po złożeniu go, jeśli nie ma błędów z przekierowaniem.

return redirect()->back()->withInput(); 

Jak @infomaniac mówi, można również użyć Input class bezpośrednio

return Redirect::back()->withInput(Input::all()); 

Dodaj: Jeśli tylko pokazać danej dziedzinie, a następnie użyć $request->only()

return redirect()->back()->withInput($request->only('name')); 

Mam nadzieję, że to może działać we wszystkich przypadkach, dziękuję.

+1

dziękuję. –

Powiązane problemy