簡體   English   中英

從Zend Framework 2中的路由獲取$ _GET參數

[英]Getting $_GET parameters from route in Zend Framework 2

Zend Framework 1有一種非常簡單的方法來解析URL路由並在$ _GET超全局中設置找到的params以便於訪問。 當然,你可以在控制器中使用 - > getParam($ something),但是如果在URL中找到了param,它可以通過$ _GET訪問。

url mypage.com/mymodule/mycontroller/myaction/someparam/5:

ZF1

$this->getParam('someparam'); // 5
$_GET['someparam']; // 5

ZF2

$this->getEvent()->getRouteMatch()->getParam('someparam'); // 5
$_GET['someparam'] // undefined index someparam

顯然,區別在於ZF2不會將路徑參數放入$ _GET超全局。

我如何將解析后的參數放入$ _GET超全局,因為擴展控制器只是定義一個構造函數,這是不可能的(因為RouteMatch還不是一個對象,不能從控制器的構造函數調用)?

調用$_GET = $this->getEvent()->getRouteMatch()->getParam('someparam'); 在我的每一個控制器都可以工作,但我不希望這樣。

換句話說,按照上面的示例URL,我希望能夠執行$ _GET ['someparam']並仍然在應用程序的任何組件中獲得值“5”。

編輯:看起來我不夠清楚,所以我會嘗試澄清一些。 我希望我通過/ key / value格式在URL中輸入的任何參數立即在$ _GET中可用。 獲取參數時我真的沒有問題,我知道如何獲取它並且我擴展了Zend的控制器,所以我可以像ZF1一樣再次調用$ this-> getParams,現在所有控制器都擴展了那個,我只是想要URL中的params自動也在$ _GET中,因此我可以在本地使用$ _GET的第三方組件中輕松訪問它們。

編輯2:更新后對Samuel Herzog的回答作出了反應:在這種情況下,我真的不介意使SRP無效,因為庫的構建方式需要他們直接訪問$ _GET - 他們自己進行過濾並直接依賴在這個超全球。 他們還直接獲取$ _FILES和$ _POST進行處理,這就是他們的代碼工作方式。

我在抽象控制器中創建了以下方法:$ this-> mergeGet(); 這基本上使$ _GET吸收所有路由匹配的參數,一切都按預期工作,但看到每個控制器/動作都需要庫,每次調用該方法可能會很繁瑣。 如果只有控制器有一個像ZF1那樣的init()方法......

在ZF2中,Im使用它

$getparams = $this->getRequest()->getQuery();

首先,如果您正在構建面向對象的堆棧,則不應直接使用$_GET或任何其他超全局。 SRP以這種方式失效。

如果你沒有可能改變你的(第三方?)圖書館的方式來改變你可能想要掛鈎到MvcEvent,聽--event--然后得到RouteMatch ,你可以用一個簡單的循環來填充$_GET

對於性能最佳的答案,您應該知道每個操作是否需要命名庫,僅針對一個模塊,還是僅針對某些控制器/操作。 如果最新版本是你的用例,你應該編寫一個控制器插件。

第一種方法的一些示例代碼:

namespace YourModule;
use Zend\EventManager\EventInterface as Event;
use Zend\Mvc\MvcEvent;

class Module
{
    ...

    public function onBootstrap(Event $ev)
    {
        $application = $e->getApplication();
        $eventManager = $application->getEventManager();

        $eventManager->attach('route', function(MvcEvent $mvcEvent) {
            $params = $mvcEvent->getRouteMatch()->getParams();

            foreach ( $params as $name => $value )
            {
                if ( ! isset($_GET[$name]) 
                {
                    $_GET[$name] = $value;
                }
            }
        });
    }
}

你可以在你的控制器中使用:

 $paramValue = $this->params()->fromQuery('your_param_here');

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM