2013-01-13 72 views
8

對於這些情況,我想自動重定向到從我發出請求的網頁:如何重定向到zend framework 2中的上一頁?

  1. 完成任何操作(CRUD等)之後 - 在這裏,我想我們需要重定向到「HTTP_REFERER」
  2. 雖然衝浪或購物,如果需要登錄,所以在完成認證過程之後,它應該回到重定向到同一頁面

不同的情況(這是不是「重定向到前一頁」):

  • 在查詢中傳遞重定向URL(登錄頁面地址),例如:如果我發送一個(外部)/ URL(ofc編碼)作爲GET查詢參數(或路由部分),登錄後應該將其重定向到這個URL

我已經上搜索網,這和發現some solutions但他們沒有按照Zend框架2。我希望所有這些都是以zf2的方式完成的。

感謝您的幫助!

回答

12

那麼,對於CRUD的東西,我只是簡單地重定向到前一個動作的路線,通常是類似於admin-indexadministrate或其他什麼。在這種情況下,我不明白爲什麼你需要HTTP_REFERER。然而,如果你仍然想訪問HTTP_REFERER這是如此簡單:

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

欲瞭解更多信息,請參閱Zend\Http\Request

一個重定向將使用來完成的Zend\Mvc\Controller\AbstractActionController

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

redirect()要看看你的用例的更多實例,我建議你查看一些非常適合你的用例的模塊。這裏最合適的可能是Zf-Commons\ZfcUserbjyoungblood\BjyAuthorize。對於這些例子中的每一個,我都鏈接了相關的代碼示例,這些代碼示例可以幫助您瞭解您的需求

+0

謝謝@Sam快速回復。這正是我一直在尋找:) – Sanju

+0

對不起,但你的鏈接已打破(+1無論如何) –

+0

@FopaLéonConstantin如果githubs鏈接中斷,我的權力。我專門使用了提交鏈接,以便它們可用:S – Sam

20

這爲我工作:

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

Neighter以上爲我工作,但這樣的:

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

【我雖然感激,如果有人清理了我,爲什麼「引薦方式「不適合我! :)謝謝!]

2

我認爲referer字段只有當你點擊鏈接並讓自己被重定向到應得的頁面時纔會設置。以http://www.whatismyreferer.com/爲例。 當你谷歌它,並點擊鏈接,這將帶你到這個網站,引用將是谷歌。但是,如果您將此網址複製並粘貼到您的網絡瀏覽器,則引用者頁面將不確定。我錯了嗎?

0

只是想從我來處理,如果用戶來自另一個頁面的最終代碼共享一個片段:

$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

這裏是一個很棒的技巧。

創建一個特質第一:

​​

然後一個接口:

<?php 

namespace Application; 

use Zend\Session; 

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

然後使用界面注入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')); 
        } 
       } 
      ) 
     ]; 
    } 
} 
在你的控制器

然後:

<?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'); 
    } 
}