Php 获取$\u从Zend Framework 2中的路由获取参数

Php 获取$\u从Zend Framework 2中的路由获取参数,php,zend-framework,routing,zend-framework2,superglobals,Php,Zend Framework,Routing,Zend Framework2,Superglobals,Zend Framework 1有一种非常简单的方法来解析URL路由,并在$\u GET superglobal中设置find参数,以便于访问。当然,您可以在控制器中使用->getParam($something),但是如果在URL中找到了该参数,那么它也可以通过$\u GET访问 urlmypage.com/mymodule/mycontroller/myaction/someparam/5的示例: ZF1 ZF2 显然,区别在于ZF2没有将路由参数放入$\u GET superglobal

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

url
mypage.com/mymodule/mycontroller/myaction/someparam/5的示例:

ZF1

ZF2

显然,区别在于ZF2没有将路由参数放入$\u GET superglobal

如何将解析后的参数放入$\u GET superglobal,因为扩展控制器并定义一个构造函数来实现这一点是不可能的(因为RouteMatch还不是一个对象,不能从控制器的构造函数调用)

调用
$\u GET=$this->getEvent()->getRouteMatch()->getParam('someparam')在我的每个控制器中都可以工作,但我不希望这样

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

编辑:看来我还不够清楚,所以我会再澄清一些。我希望通过/key/value formation在URL中输入的任何参数都能在$\u GET中立即可用。我在获取参数方面没有什么问题,我知道如何获取它,我扩展了Zend的控制器,这样我就可以像在ZF1中一样再次调用$this->getParams,现在所有控制器都扩展了该参数,我只希望URL中的参数也自动位于$\u get中,因此,我可以在第三方组件中轻松访问它们,这些组件在本机上使用$\u GET

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

我在抽象控制器中创建了以下方法:
$this->mergeGet();这基本上使$_GET吸收了所有路由匹配的参数,并且一切都按预期工作,但是由于每个控制器/操作都需要库,因此每次调用该方法可能会变得单调乏味。如果控制器只有一个类似于ZF1中的init()方法…

首先,如果在面向对象堆栈上构建,则不应直接使用
$\u GET
或任何其他超全局方法。SRP以这种方式无效

如果您无法更改(第三方?)库的更改方式,您可能希望挂接到MvcEvent,听--event--然后获取
路由匹配
,您可以用一个简单的循环填充
$\u 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;
                }
            }
        });
    }
}
在ZF2中,我使用这个

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

您可以在控制器中使用:

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

如果您对答案不太确定,请在控制器或请求上尝试
->params('key',$defaultValue)
,我想这就是您要找的。我在获取参数方面没有问题,我担心的是另一个问题。请参见编辑的question@Sam它的
Controller::Params('key',$default)
调用一个控制器插件(Params),以阻止您编写
Controller::getEvent()->getRouteMatch()->getParam(…)
。感谢@Swader的更新,每个Modules onBootstrap事件在每次请求时都会被调用。因此,如果有一个请求/商店/产品/牛奶,并且示例代码在应用程序中,而不是在商店模块中,它将被调用!在一个中心位置(您的应用程序/Module.php)监听route事件将非常完美。好的,这是典型的ZF,没有关于如何监听模块类中的引导事件的文档,您能给我一个提示吗?也许可以把它放在答案中,这样如果它符合我的要求,我就可以将它标记为已接受?文档正在编制中,这就是为什么它只是RC atm;)我提供的代码正是这样做的。请参阅:
$eventManager->attach('route',function(MvcEvent$e){…
只是一个作为侦听器附加的匿名函数。请参阅此处我的答案,以获取更简单和最新的参数获取。哎哟,我的错。不需要先访问路由器,它只是
$e->getRouteMatch()->getParams()
请参阅。
路由
-事件被认为是针对路由器的,因此您可能希望以非常低的优先级(例如-1000)收听,或者以非常高的优先级收听
调度
(路由已明确设置)。
$getparams = $this->getRequest()->getQuery();
 $paramValue = $this->params()->fromQuery('your_param_here');