2013-01-13 3 views
8

Per queste situazioni, voglio auto reindirizzare nuovo alle pagine in cui ho fatto la richiesta:Come posso reindirizzare alla pagina precedente in zend framework 2?

  1. Dopo aver terminato qualsiasi azione (CRUD, ecc) - Qui penso che abbiamo bisogno di reindirizzare a 'HTTP_REFERER'
  2. Mentre surf o lo shopping, se è richiesto l'accesso, quindi dopo aver terminato processo di autenticazione, dovrebbe reindirizzare indietro alla stessa pagina

Una situazione diversa (che non e 'redirect alla pagina precedente'):

  • Passare un URL di reindirizzamento (indirizzo della pagina di destinazione) nella query, ad esempio: se invio un (esterno)/URL (codificato in c) come parametro di ricerca GET (o parte percorso), dopo il login, dovrebbe reindirizzare a questo URL

ho già cercato più di rete per questo e trovato some solutions ma non sono in base al Zend Framework 2. Voglio che tutto questo sia fatto in modo zf2.

Grazie per qualsiasi aiuto!

risposta

12

Bene, per il materiale CRUD, ho semplicemente reindirizzato ai percorsi dell'azione precedente, di solito qualcosa come admin-index, administrate o qualsiasi altra cosa. In realtà non vedo perché dovresti avere lo HTTP_REFERER in quel caso. Se invece si vuole ancora accedere al HTTP_REFERER è semplice come questo:

//SomeController.php 
$redirectUrl = $this->getRequest()->getHeader('HTTP_REFERER', $defaultValue); 

Per ulteriori informazioni vedere Zend\Http\Request

un redirect sarebbe stato fatto utilizzando il redirect() del Zend\Mvc\Controller\AbstractActionController

$this->redirect()->toUrl($redirectUrl); //or using a route: 
$this->redirect()->toRoute('some/route'); 

Per vedi alcuni esempi dal vivo dei tuoi casi d'uso, ti suggerisco di controllare alcuni dei Moduli che si adattano perfettamente ai tuoi casi d'uso. Probabilmente i più adatti qui sarebbero Zf-Commons\ZfcUser e bjyoungblood\BjyAuthorize. Per ognuno di questi esempi ho collegato esempi di codice rilevanti che potrebbero far capire meglio le vostre esigenze.

+0

Grazie a @Sam per una risposta rapida. È esattamente quello che stavo cercando :) – Sanju

+0

Mi dispiace Sam ma i tuoi link sono al verde (+1 in ogni caso) –

+0

@ FopaLéonConstantin fuori dal mio potere se i link di githubs si interrompono. Ho usato specificamente i link di commit in modo che siano disponibili: S – Sam

20

questo ha funzionato per me:

$url = $this->getRequest()->getHeader('Referer')->getUri(); 
$this->redirect()->toUrl($url); 
0

Neighter di quanto sopra ha funzionato per me, ma questo:

$url = $this->getRequest()->getHeaders('cookie')->original_url; 
$this->redirect()->toUrl($url); 

[Gradirei però, se qualcuno mi chiarito, perché il 'referer modo 'non funziona per me! :) Grazie!]

2

Penso che il campo di riferimento sia impostato solo quando si fa clic sul collegamento e si lasci reindirizzare alla pagina meritata. Prendiamo ad esempio http://www.whatismyreferer.com/. Quando lo fai su Google e fai clic sul link, che ti porta su questo sito, il referer sarà il google. Ma se si copia e incolla questo URL sul proprio browser Web, la pagina di riferimento non sarà definita. Ho sbagliato?

0

voluto solo condividere un frammento dal mio codice finale che gestisce se l'utente proviene da un'altra pagina:

$referer = $this->getRequest()->getHeader('Referer'); 
if ($referer) { 
    $refererUrl = $referer->uri()->getPath(); // referer url 
    $refererHost = $referer->uri()->getHost(); // referer host 
    $host = $this->getRequest()->getUri()->getHost(); // current host 

    // only redirect to previous page if request comes from same host 
    if ($refererUrl && ($refererHost == $host)) { 
     return $this->redirect()->toUrl($refererUrl); 
    } 
} 
// redirect to home if no referer or from another page 
return $this->redirect()->toRoute('home'); 
0

Ecco un trucco fresco.

Creare un tratto prima:

<?php 

namespace Application\Controller\Plugin; 

use Zend\Session; 

trait RefererRedirect 
{ 
    /** 
    * @var Session\Container 
    */ 
    private $sessionContainer; 

    /** 
    * @param Session\Container $sessionContainer 
    */ 
    public function setSessionContainer(Session\Container $sessionContainer) 
    { 
     $this->sessionContainer = $sessionContainer; 
    } 

    protected function clearReferer() 
    { 
     $this->sessionContainer->offsetUnset('referer'); 
    } 

    protected function registerReferer() 
    { 
     if (!$this->sessionContainer->offsetExists('referer')) { 
      $this->sessionContainer->offsetSet('referer', $this->getRequest()->getHeader('Referer')->uri()->getPath()); 
     } 
    } 

    protected function redirectToRefererOrDefaultRoute($defaultRoute, $defaultParams = []) 
    { 
     if ($this->sessionContainer->offsetExists('referer')) { 
      $url = $this->sessionContainer->offsetGet('referer'); 
      $this->clearReferer(); 

      return $this->redirect()->toUrl($url); 
     } 

     return $this->redirect()->toRoute($defaultRoute, $defaultParams); 
    } 
} 

Poi un'interfaccia:

<?php 

namespace Application; 

use Zend\Session; 

interface RefererAwareInterface 
{ 
    /** 
    * @param Session\Container $sessionContainer 
    */ 
    public function setSessionContainer(Session\Container $sessionContainer); 
} 

quindi utilizzare l'interfaccia per iniettare SessionContainer:

<?php 

namespace Application; 

class Module 
{ 
    public function getControllerConfig() 
    { 
     return [ 
      'factories' => [ 
      ], 
      'initializers' => array(
       function ($instance, $sm) { 
        if ($instance instanceof RefererAwareInterface) { 
         $instance->setSessionContainer(new Session\Container('Referer')); 
        } 
       } 
      ) 
     ]; 
    } 
} 

Poi nel controller:

<?php 

namespace Auth\Controller; 

class UsersController extends AbstractActionController implements RefererAwareInterface 
{ 
    use RefererRedirect; 

    public function indexAction() 
    { 
     $this->clearReferer(); 

     // do stuff 
    } 

    public function addAction() 
    { 
     $this->registerReferer(); 

     // do stuff 

     return $this->redirectToRefererOrDefaultRoute('auth/users'); 
    } 

    public function backAction() 
    { 
     return $this->redirectToRefererOrDefaultRoute('auth/users'); 
    } 
} 
Problemi correlati