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');
问候