从Zend Framework 2中的路由获取$_GET参数


Getting $_GET parameters from route in Zend Framework 2

Zend Framework 1有一种非常简单的方法来解析URL路由,并在$_GET超全局中设置find参数,以便于访问。当然,您可以在控制器中使用->getParam($something),但如果在URL中找到参数,则也可以通过$_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中的参数也自动在$_get中,这样我可以在本机使用$_get的第三方组件中轻松访问它们。

编辑2:更新为对Samuel Herzog回答的回应:在这种情况下,我真的不介意使SRP无效,因为库是以这样一种方式构建的,它们需要直接访问$_GET——它们自己进行过滤,并直接依赖于这个超全局。他们还直接获取$_FILES和$_POST进行处理,这只是他们代码的工作方式。

我在抽象控制器中制作了以下方法:$this->mergeGet();这基本上使$_GET吸收了所有路由匹配的参数,一切都按预期进行,但由于每个控制器/操作都需要库,每次调用该方法可能会很乏味。如果控制器有像ZF1中那样的init()方法…

在ZF2中,我使用这个

$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');

问候