Zend Framework 1 有一种非常简单的方法来解析 URL 路由并在 $_GET 超全局中设置找到的参数以便于访问。当然,您可以在控制器中使用 ->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');
我的每个控制器都可以,但我不希望这样。
换句话说,按照上面的示例 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() 方法......