2015-11-24 13 views
6

Immagina di avere un metodo nel controller, ad esempio la memorizzazione di una nuova società. Immaginate anche di poter creare una nuova azienda da pagine diverse nel nostro sito. Ad esempio, posso creare un'azienda da 2-3 pagine.Reindirizza a pagine diverse in base alla pagina precedente in Laravel

A seconda di dove ho creato l'azienda, ho bisogno di avere reindirizzamenti diversi. A volte ho bisogno di reindirizzare indietro, e talvolta ad altre rotte.

Qualcosa di simile:

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

credo non riesco a ottenere il nome della rotta wher utente provenienza. Se controllo URL del referrer, nel caso in cui io modifichi l'URL del percorso, tutto verrà interrotto, quindi preferisco fare affidamento sui nomi delle rotte. Inoltre, la soluzione con molti "se-s" o un "interruttore" è un po 'strana, inquinerà il codice.

È necessario anche il supporto con caratteri jolly. Una sorta di mappa del percorso con reindirizzamenti o qualcosa del genere.

Qualche consiglio su come implementarlo?

+1

Dal momento che sto cercando di indovinare che stai postando l'azione di controllo, perché non si può semplicemente passare un valore che indica se si dovrebbe essere reindirizzato? E puoi semplicemente includere quel valore nei moduli necessari (dal momento che hai detto che hai 2-3 pagine che lo fanno, presumo tu possa regolare i moduli su ciascuno come preferisci). L'approccio che cerchi non ha soluzioni affidabili ed è eccessivamente complicato. – Bogdan

+0

Soluzione eccezionale. L'unica cosa è che adesso ho una finestra modale con la forma. Mostro la modale quando clicco su pulsanti diversi e, a seconda di dove ho fatto clic, devo reindirizzare l'utente a pagine diverse. Così ho creato 3 file: form.blade.php, modal1.blade.php e modal2.blade.php. Includo il modulo in questi modali e li passo redirect_to param, e all'interno del modulo ho inserito input nascosti con questo parametro – Victor

risposta

0

Bene, puoi confrontare l'url precedente con l'url di qualsiasi percorso. Non è la soluzione migliore e non so cosa fare con i parametri del percorso, ma può funzionare.

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

Vorrei attenermi a questo, tuttavia mi piace anche la soluzione di Bogdan – Victor

0

Un insieme di if dichiarazioni (o un switch) sarà necessario qualche parte, poiché è necessario prendere una decisione.

Non farei affidamento sull'URL del referrer, poiché si interromperà se cambi mai le rotte. Come te, preferisco i nomi dei percorsi per tutto, dal momento che i miei URL possono cambiare.

Come su una chiave di sessione? Impostare un valore, quindi recuperarlo & scegliere il reindirizzamento dopo aver creato la società. Qualcosa di simile a questo:

Nel metodo controller per creare società page # 1

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

Poi, dopo che la società si crea

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

Non è bello, ma si farà il trucco. Inoltre ha un grande vantaggio: puoi rendere i valori della sessione come vuoi, quindi se hai bisogno di aggiungere ulteriori informazioni per prendere la decisione, vai avanti. Hai bisogno di caratteri jolly? Imposta la chiave di sessione come preferisci per passare quelle informazioni.

+0

Memorizzare i valori in una sessione è altrettanto inaffidabile quanto utilizzare il referrer passato, perché un utente può avere più schede aperte nel browser, tutti condividono la stessa sessione. Proprio come il referrer può essere spoofing o mancante, non puoi essere sicuro che la pagina precedente sia stata quella che ha impostato il valore della sessione. – Bogdan

0

non ho potuto Unterstand se una "logica" dietro la schiena di routing dopo aver salvato il Company. In una delle mie app dovevo essere in grado di modificare un indirizzo e reindirizzare all'URL precedente o alla pagina indice.

Se questo è il caso nella vostra applicazione, c'è una soluzione abbastanza semplice e pulita a questo.

Stiamo lanciando la funzione Laravel redirect()->intented().

Nella tua funzione GET (ad es.getCreate) stiamo impostando l'URL intented all'URL precedente se non è lo stesso che l'URL stesso:

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

Ora all'interno del vostro metodo di POST (ad es postCreate) si può semplicemente restituire un reindirizzamento all'URL previsto in questo modo:

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