Laravel przekierowanie z powrotem z komunikatem ()

158

Próbuję przekierować do poprzedniej strony z komunikatem, gdy wystąpi błąd krytyczny.

App::fatal(function($exception)
{
    return Redirect::back()->with('msg', 'The Message');
}

W widoku próbując uzyskać dostęp do wiadomości za pomocą

Sessions::get('msg')

Ale nic się nie renderuje, czy robię tu coś nie tak?

Mudit Tuli
źródło
1
popraw sesję z literówką si dodaj w userazie potrzeby. Poza tym - powinno działać.
Yevgeniy Afanasyev

Odpowiedzi:

234

Próbować

return Redirect::back()->withErrors(['msg', 'The Message']);

i wewnątrz twojego widoku nazwij to

@if($errors->any())
<h4>{{$errors->first()}}</h4>
@endif
giannis christofakis
źródło
8
To działa, ale fajnie. Ale dlaczego to nie zadziała, return Redirect::back()->with('msg', 'The Message'); jak uzyskać tutaj „msg”?
Mudit Tuli
Czy próbowałeś sprawdzić, czy wiadomość tam jest? Session::has('msg')
giannis christofakis
Tak, zaznaczone, Session::has('msg')a „msg” nie ma.
Mudit Tuli
2
@giannischristofakis Na pewno na to wygląda. Nie mam pojęcia, co paliłem tego zimnego, mglistego poranka we wrześniu.
StackOverflowed
7
5,4 , withErrors('some error')- więc musi być ciągiem zamiast tablicy.
senty
127

Laravel 5 i nowsze

Kontroler

 return redirect()->back()->with('success', 'your message,here');   

Nóż:

@if (\Session::has('success'))
    <div class="alert alert-success">
        <ul>
            <li>{!! \Session::get('success') !!}</li>
        </ul>
    </div>
@endif
Ketan Akbari
źródło
7
Konwersja tablicy na ciąg :(
Yevgeniy Afanasyev
Komentarz pozostawiony jako edycja: Jeśli daje błąd: konwersja tablicy na ciąg, to tylko mała poprawka w kontrolerze return redirect()->back()->with('success', 'your message here');
Michael
@Michael Co masz na myśli, jeśli? Na pewno zwraca tablicę!
Andrew Savetchuk
@AndrewSavetchuk - to nie jest mój komentarz. Inny użytkownik SO zredagował odpowiedź, gdy powinien po prostu zostawić tutaj komentarz lub stworzyć własną odpowiedź.
Michael
@Michael powinniśmy edytować odpowiedź we właściwy sposób, ponieważ jeśli uruchomisz ten kod, to nie zadziała.
Andrew Savetchuk
62

Byłoby alternatywne podejście

Kontroler

use Session;
       
Session::flash('message', "Special message goes here");
return Redirect::back();

Widok

@if (Session::has('message'))
   <div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
Stóg
źródło
22

W Laravel 5.4 działały dla mnie:

return back()->withErrors(['field_name' => ['Your custom message here.']]);
haakym
źródło
Cześć. Odpowiedź odebrana jest do stosowania w laravel 4 (patrz tag), tym, że parametry withErrors()sposobu odpowiedź jest tablicą z dwóch elementów: ['msg', 'The Message']. Zobacz api dla akceptowalnych parametrów: laravel.com/api/4.2/Illuminate/Http/ ...
haakym
W mojej odpowiedzi, do użycia w Laravel 5.4, parametrami withErrors()metody jest tablica z jednym elementem będącym key => valueparą, gdzie wartością jest tablica. 5.4 API: laravel.com/api/5.4/Illuminate/Http/…
haakym
13

Masz błąd (literówka):

Sessions::get('msg')// an extra 's' on end

Powinien być:

Session::get('msg')

Myślę, że teraz powinno działać, dla mnie działa.

bumerang
źródło
8

Po prostu ustaw wiadomość flash i przekieruj z powrotem z funkcji kontrolera.

    session()->flash('msg', 'Successfully done the operation.');
    return redirect()->back();

Następnie możesz otrzymać wiadomość w pliku widoku bloku.

   {!! Session::has('msg') ? Session::get("msg") : '' !!}
Majbah Habib
źródło
Myślę, że {!! Session::get("msg", '') !!}powinno wystarczyć. get()już sprawdza, czy klucz istnieje, aw przeciwnym razie zwraca wartość domyślną.
Emile Bergeron
8

W Laravel 5.5 :

return back()->withErrors($arrayWithErrors);

W widoku z Blade:

@if($errors->has())
    <ul>
    @foreach ($errors->all() as $error)
        <li>{{ $error }}</li>
    @endforeach
    </ul>
@endif
Sergio
źródło
2
$ errors-> ma () był nie tylko $ errors-> any () działa dobrze
robspin
6

W laravel 5.8 możesz wykonać następujące czynności:

return redirect()->back()->withErrors(['name' => 'The name is required']);

aw ostrzu:

@error('name')
<p>{{ $message }}</p>
@enderror
justijn
źródło
4

Przestałem pisać to sam dla laravel na rzecz pakietu Laracasts, który obsługuje to wszystko za Ciebie. Jest naprawdę łatwy w użyciu i utrzymuje kod w czystości. Jest nawet laracast, który wyjaśnia , jak go używać. Wszystko co musisz zrobić:

Pobierz paczkę przez Composer.

"require": {
  "laracasts/flash": "~1.0"
}

Uwzględnij dostawcę usług w app / config / app.php.

'providers' => [
  'Laracasts\Flash\FlashServiceProvider'
];

Dodaj alias fasady do tego samego pliku u dołu:

'aliases' => [
  'Flash' => 'Laracasts\Flash\Flash'
];

Przeciągnij kod HTML do widoku:

@include('flash::message') 

Po prawej stronie wiadomości znajduje się przycisk zamykania. Zależy to od jQuery, więc upewnij się, że zostało dodane przed bootstrapem.

opcjonalne zmiany:

Jeśli nie używasz bootstrapu lub chcesz pominąć dołączanie wiadomości flash i samodzielnie napisać kod:

@if (Session::has('flash_notification.message'))
  <div class="{{ Session::get('flash_notification.level') }}">
    {{ Session::get('flash_notification.message') }}
  </div>
@endif

Jeśli chcesz wyświetlić pobrany kod HTML @include('flash::message'), możesz go znaleźć w vendor/laracasts/flash/src/views/message.blade.php.

Jeśli chcesz zmodyfikować części składowe, wykonaj:

php artisan view:publish laracasts/flash

Dwa widoki pakietów będą teraz znajdować się w katalogu `app / views / packages / laracasts / flash / '.

DutGRIFF
źródło
4

w kontrolerze

Na przykład

return redirect('login')->with('message',$message);

w pilniku Wiadomość będzie przechowywana w sesji, a nie w zmiennej.

Na przykład

@if(session('message'))
{{ session('message') }}
@endif
Hatim Hussein
źródło
3

Dla Laravel 5.5+

Kontroler:

return redirect()->back()->with('success', 'your message here');

Nóż:

@if (Session::has('success'))
    <div class="alert alert-success">
        <ul>
            <li>{{ Session::get('success') }}</li>
        </ul>
    </div>
@endif
Andrew Savetchuk
źródło
2

Miałem ten sam problem i to zadziałało.

Kontroler

return Redirect::back()->withInput()->withErrors(array('user_name' => $message));

Widok

<div>{{{ $errors->first('user_name') }}}</div>
A. Mitani
źródło
2

Dla laravel 5.6. *

Podczas wypróbowywania niektórych odpowiedzi udzielonych w Laravel 5.6. *, Jasne jest, że pojawiły się pewne ulepszenia, które zamierzam tutaj opublikować, aby ułatwić sprawę tym, którzy nie mogli znaleźć rozwiązania z pozostałymi odpowiedziami.

KROK 1:

Przejdź do pliku kontrolera i dodaj to przed zajęciami:

use Illuminate\Support\Facades\Redirect;

KROK 2: Dodaj to, gdzie chcesz zwrócić przekierowanie.

 return Redirect()->back()->with(['message' => 'The Message']);

KROK 3: Przejdź do pliku blade i edytuj w następujący sposób

@if (Session::has('message'))
<div class="alert alert-error>{{Session::get('message')}}</div>
 @endif

Następnie przetestuj i podziękuj mi później.

To powinno działać z Laravel 5.6. * I prawdopodobnie 5.7. *

Akintunde
źródło
1

W przypadku Laravel 3

Tylko ostrzeżenie w odpowiedzi na @giannis christofakis; dla każdego używającego Laravel 3 wymień

return Redirect::back()->withErrors(['msg', 'The Message']);

z:

return Redirect::back()->with_errors(['msg', 'The Message']);
Dev1997
źródło
1

Laravel 5.6. *

Kontroler

if(true) {
   $msg = [
        'message' => 'Some Message!',
       ];

   return redirect()->route('home')->with($msg);
} else {
  $msg = [
       'error' => 'Some error!',
  ];
  return redirect()->route('welcome')->with($msg);
}

Szablon ostrza

  @if (Session::has('message'))
       <div class="alert alert-success" role="alert">
           {{Session::get('message')}}
       </div>
  @elseif (Session::has('error'))
       <div class="alert alert-warning" role="alert">
           {{Session::get('error')}}
       </div>
  @endif

Enyoj

The Bumpaster
źródło
0

Otrzymałem tę wiadomość, gdy próbowałem przekierować jako:

public function validateLogin(LoginRequest $request){
    //

    return redirect()->route('sesion.iniciar')
            ->withErrors($request)
            ->withInput();

Kiedy właściwa droga to:

public function validateLogin(LoginRequest $request){
    //

    return redirect()->route('sesion.iniciar')
            ->withErrors($request->messages())
            ->withInput();
manix
źródło
0

Laravel 5.8

Kontroler

return back()->with('error', 'Incorrect username or password.');

Nóż

  @if (Session::has('error'))
       <div class="alert alert-warning" role="alert">
           {{Session::get('error')}}
       </div>
  @endif
wobsoriano
źródło