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

时间:2012-08-05 23:11:35

标签: php zend-framework routing zend-framework2 superglobals

Zend Framework 1有一种非常简单的方法来解析URL路由并在$ _GET超全局中设置找到的params以便于访问。当然,您可以在控制器中使用 - > getParam($ something),但如果在URL中找到了参数,那么可通过$ _GET访问。

网址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');都可以,但我不希望这样。

换句话说,按照上面的示例网址,我希望能够执行$ _GET ['someparam'],并且仍然可以在应用程序的任何组件中获得值“5”。

编辑:看起来我不够清楚,所以我会尝试澄清一些。我希望我通过/ key / value格式在URL中输入的任何参数立即在$ _GET中可用。获取参数时我真的没有问题,我知道如何获得它并且我扩展了Zend的控制器,所以我可以像ZF1一样再次调用$ this-> getParams,现在所有控制器都扩展了那个,我只是希望URL中的参数自动也在$ _GET中,因此我可以在本地使用$ _GET的第三方组件中轻松访问它们。

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

我在抽象控制器中创建了以下方法: $这 - > mergeGet();这基本上使$ _GET吸收所有路由匹配的参数,一切都按预期工作,但看到每个控制器/动作都需要库,每次调用该方法可能会很繁琐。如果只有控制器有一个init()方法,如ZF1 ...

3 个答案:

答案 0 :(得分:13)

在ZF2中,我正在使用此

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

答案 1 :(得分:7)

首先,如果您正在构建面向对象的堆栈,则不应直接使用$_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;
                }
            }
        });
    }
}

答案 2 :(得分:1)

您可以在控制器中使用:

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

此致