7

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() 方法......

4

3 回答 3

13

在 ZF2 中,我使用这个

$getparams = $this->getRequest()->getQuery();
于 2013-01-15T03:03:48.630 回答
8

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

如果您无法更改(第 3 方?)库的更改方式,您可能想挂接到 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;
                }
            }
        });
    }
}
于 2012-08-06T17:14:15.450 回答
1

您可以在控制器中使用:

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

问候

于 2016-05-27T01:47:03.213 回答