2015-11-24 11 views
6

Wyobraź sobie, że masz metodę w kontrolerze, na przykład zapisanie nowej firmy. Wyobraźmy sobie również, że możemy stworzyć nową firmę z różnych stron na naszej stronie. Na przykład mogę utworzyć firmę z 2-3 stron.Przekierowanie do różnych stron w oparciu o poprzednią stronę w Laravel

W zależności od miejsca, w którym utworzyłem firmę, muszę mieć różne przekierowania. Czasami trzeba przekierować z powrotem, a czasem na inne trasy.

Coś jak:

if ($previousRoute === 'companies.index') { 
    return redirect()->back(); 
} else { 
    return redirect()->route('someroute'); 
} 

Chyba nie można uzyskać nazwę trasy wher użytkownik pochodzi. Jeśli sprawdzę adres URL strony odsyłającej, to w przypadku, gdy zmienię adres URL trasy, wszystko zostanie zerwane, więc zamiast tego opieram się na nazwach tras. Dodatkowo, rozwiązanie mające wiele "if-s" lub "switch" jest dość dziwne, zanieczyszcza kod.

Potrzebna jest również obsługa symboli wieloznacznych. Jakiś rodzaj mapy trasy z przekierowaniami lub czymś w tym stylu.

Każda rada, jak to wdrożyć?

+1

Ponieważ domyślam się, że jesteś POSTINGem do działania kontrolera, dlaczego nie możesz po prostu przekazać wartości, która wskazuje, czy powinieneś zostać przekierowany z powrotem? I możesz po prostu uwzględnić tę wartość w wymaganych formularzach (ponieważ powiedziałeś, że masz 2-3 strony, które to robią, zakładam, że możesz dopasować formularze do każdego, tak jak ci odpowiada). Podejście, którego szukasz, nie ma wiarygodnych rozwiązań i jest zbyt skomplikowane. – Bogdan

+0

Niesamowite rozwiązanie. Jedyną rzeczą jest to, że mam teraz okno modalne z formularzem. Po kliknięciu różnych przycisków pokazuję modalny iw zależności od tego, gdzie kliknąłem, muszę przekierować użytkownika na różne strony. Zrobiłem 3 pliki: form.blade.php, modal1.blade.php i modal2.blade.php. Załączam formularz do tych modałów i przekazuję je do parametru redirect_to, a wewnątrz formularza umieszczam ukryte dane wejściowe z tym parametrem – Victor

Odpowiedz

0

Cóż, możesz porównać poprzedni URL z adresem URL dowolnej trasy. To nie jest najlepsze rozwiązanie i nie wiem, co zrobić z parametrami trasy, ale może działać.

if (URL::previous() === URL::route('companies.index')) { 
    return redirect()->back(); 
} else { 
    return redirect()->route('someroute'); 
} 
+0

Trzymałbym się tego, ale lubię też rozwiązanie Bogdana – Victor

0

Wymagany będzie zestaw if (lub switch) gdzieś gdzieś, ponieważ musisz podjąć decyzję.

Nie będę korzystał z adresu URL strony odsyłającej, ponieważ ulegnie ona uszkodzeniu, jeśli zmienisz trasę. Tak jak Ty, wolę nazwy tras dla wszystkiego, ponieważ moje adresy URL mogą się zmieniać.

Co z kluczem sesji? Ustaw pewną wartość, a następnie pobierz ją. Wybierz przekierowanie po utworzeniu firmy. Coś takiego:

W metodzie kontrolera do stworzenia firmy strona # 1

Session::put('create-company-method', 1); 

Następnie, po tym jak firma jest tworzony

$flag = Session::get('create-company-method'); 
if ($flag===1) { 
    return redirect()->route('go-here-next'); 
} else if ($flag===2) { 
    ... 
} 

To nie jest ładna, ale będzie to rade. Dodatkowo ma dużą zaletę: możesz ustawić wartości sesji, jakie tylko chcesz, więc jeśli potrzebujesz dodatkowych informacji do podjęcia decyzji, śmiało. Potrzebujesz symboli wieloznacznych? Ustaw klucz sesji, ale chcesz go przekazać.

+0

Przechowywanie wartości w sesji jest tak samo niewiarygodne, jak użycie przekazanego referrer, ponieważ użytkownik może mieć wiele zakładek otwartych w przeglądarce, wszyscy dzielą tę samą sesję. Podobnie jak osoba odsyłająca może zostać sfałszowana lub zaginiona, nie można mieć pewności, że poprzednia strona była tą, która ustawiła wartość sesji. – Bogdan

0

nie mogłem unterstand jeśli masz jakieś „logikę” za routing z powrotem po zapisaniu Company. W jednej z moich aplikacji musiałem mieć możliwość edycji adresu i przekierowania z powrotem do poprzedniego adresu URL lub z powrotem do strony indeksu.

Jeśli tak jest w przypadku wniosku, istnieje dość proste i czyste rozwiązanie tego problemu.

Usuwamy funkcję Laravel redirect()->intented().

W swojej funkcji GET (np.getCreate) jesteśmy ustawienie odnie URL do poprzedniego adresu URL, jeśli nie jest taki sam jak adres URL samej:

($request->fullUrl() != URL::previous()) ? session()->set('url.intended', URL::previous()) : null; 
// url.intended is the same key that is used be Laravels intented function 

Teraz w swoim sposobie POST (np postCreate) można po prostu wrócić przekierowanie do zamierzonego URL tak:

return redirect()->intended('[email protected]'); 
// The string within intended() defines where you want to be redirected if there is no session key is found