Zend Framework:我可以获得GET参数吗?

时间:2010-09-30 13:17:02

标签: php zend-framework

在Zend Framework中,大部分时间来获得一个参数,我将使用

// from controller
$this->getRequest()->getParam('key');

但我如何才能使用'Zend'方式获得GET参数?或者我只使用$_GET

之间有什么区别吗?
$this->getRequest()->getParam('key');

vs

$_GET['key'];

5 个答案:

答案 0 :(得分:33)

使用getQuery()

$this->_request->getQuery('key');

其他可用方法包括

  • getParam()不只
  • getQuery()
  • 的getPost()
  • 的getCookie()
  • getServer()
  • GETENV()

getParam()首先检查用户参数,然后检查$ _GET,然后检查$ _POST,返回找到的第一个匹配项或null。

尽量避免直接访问超全球。

答案 1 :(得分:12)

主要区别在于

$_GET['key'];

是对环境的依赖。它要求超全局可用并包含该名称的密钥。它也只是一个简单的数组访问,而

$this->getRequest()->getParam('key');

是一种API方法调用。对请求的访问是抽象的。不依赖于实际环境。 Request对象可以是mock。无论是getParam还是$_GET$_POST方法都会返回一个值。

在Request之上放置一个抽象更好,因为它允许更多的解耦,更少的依赖性,因此使您的应用程序更容易测试和维护。

答案 2 :(得分:1)

这适用于ZF2

$this->params()->fromQuery('key', 1); // second argument is optional default paramter

答案 3 :(得分:0)

在研究Zend 2's in depth data binding documentation后,我发现最好通过自动访问的Params plugin访问路线中的参数。利用此插件,您可以从控制器中获取如下所示的参数。

$this->params('key');

答案 4 :(得分:0)

在Zend Framework 1中,有两种定义“可见”参数的可能性。

https://subdomain.domain.tld(/ module)/ controller / name / parameter1 / value1 https://subdomain.domain.tld(/ module)/ controller / name /?parameter2 = value2

第一个parameter1是URL路径的一部分,第二个parameter2是真实的GET参数。如果调用$request->getParams(),则两者都将返回。但是使用parameter2时仅返回$request->getQuery()。因为parameter1不是查询的一部分。它是url的一部分,符合逻辑。

现在,我喜欢Ryan Chouinard的答案,如何用parameter2获得$request->getQuery()。但是parameter1的行为就像一个GET参数,我想这样对待它们。那么如何从帖子数据中获取可见的parameter1parameter2而不是其他隐藏的parameter3

我唯一的解决方案是一个助手,该助手将克隆请求并将所谓的paramSources(默认值:['_GET', '_POST'])更改为['_GET'],然后按常规使用getParam()

/**
 * @param Zend_Controller_Request_Http $request
 * @param string                       $param
 * @param mixed|null                   $default
 *
 * @return mixed|null
 */
function getVisibleParam(string $param, $default = null, Zend_Controller_Request_Http $request = null)
{
    if (
        !$request &&
        !($request = Zend_Controller_Front::getInstance()->getRequest())
    ) {
        throw new \RuntimeException('There is no request. Are you in a wrong context?');
    }

    $_request = clone $request;
    $_request->setParamSources(['_GET']);

    return $_request->getParam($param, $default);
}