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 ...
答案 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');
此致