Swa*_*der 6 php routing zend-framework superglobals zend-framework2
Zend Framework 1有一种非常简单的方法来解析URL路由并在$ _GET超全局中设置找到的params以便于访问.当然,你可以在控制器中使用 - > getParam($ something),但是如果在URL中找到了param,它也可以通过$ _GET访问.
url的示例 mypage.com/mymodule/mycontroller/myaction/someparam/5:
ZF1
$this->getParam('someparam'); // 5
$_GET['someparam']; // 5
Run Code Online (Sandbox Code Playgroud)
ZF2
$this->getEvent()->getRouteMatch()->getParam('someparam'); // 5
$_GET['someparam'] // undefined index someparam
Run Code Online (Sandbox Code Playgroud)
显然,区别在于ZF2不会将路径参数放入$ _GET超全局.
我如何将解析后的参数放入$ _GET超全局,因为扩展控制器只是定义一个构造函数,这是不可能的(因为RouteMatch还不是一个对象,不能从控制器的构造函数调用)?
调用$_GET = $this->getEvent()->getRouteMatch()->getParam('someparam');我的每个控制器都可以,但我不希望这样.
换句话说,按照上面的示例URL,我希望能够执行$ _GET ['someparam']并仍然在应用程序的任何组件中获得值"5".
编辑:看起来我不够清楚,所以我会尝试澄清一些.我希望我通过/ key/value格式在URL中输入的任何参数立即在$ _GET中可用.获取参数时我真的没有问题,我知道如何获取它并且我扩展了Zend的控制器,所以我可以像ZF1一样再次调用$ this-> getParams,现在所有控制器都扩展了那个,我只是想要URL中的params自动也在$ _GET中,因此我可以在本地使用$ _GET的第三方组件中轻松访问它们.
编辑2:更新后对Samuel Herzog的回答作出了反应:在这种情况下,我真的不介意使SRP无效,因为库的构建方式需要他们直接访问$ _GET - 他们自己进行过滤并直接依赖在这个超全球.他们还直接获取$ _FILES和$ _POST进行处理,这就是他们的代码工作方式.
我在抽象控制器中创建了以下方法:$ this-> mergeGet(); 这基本上使$ _GET吸收所有路由匹配的参数,一切都按预期工作,但看到每个控制器/动作都需要库,每次调用该方法可能会很繁琐.如果只有控制器有一个像ZF1那样的init()方法......
小智 13
在ZF2中,Im使用它
$getparams = $this->getRequest()->getQuery();
Run Code Online (Sandbox Code Playgroud)
首先,$_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;
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)