如何在Zend Framework 2中访问route,post,get等参数


Answers:


205

最简单的方法是使用beta5中引入的Params插件。它具有实用方法,可轻松访问不同类型的参数。与往常一样,阅读测试可以证明对理解应该如何使用某些东西很有价值。

获得单一价值

要获取控制器中命名参数的值,您将需要为要查找的参数类型选择适当的方法,然后传递名称。

例子:

$this->params()->fromPost('paramname');   // From POST
$this->params()->fromQuery('paramname');  // From GET
$this->params()->fromRoute('paramname');  // From RouteMatch
$this->params()->fromHeader('paramname'); // From header
$this->params()->fromFiles('paramname');  // From file being uploaded

 

默认值

所有这些方法还支持默认值,如果未找到具有给定名称的参数,则将返回默认值。

例:

$orderBy = $this->params()->fromQuery('orderby', 'name');

当访问http://example.com/?orderby=birthdate时$ orderBy将具有值birthdate
访问http://example.com/时$ orderBy将具有默认name
 

获取所有参数

要获取一种类型的所有参数,只需不传递任何内容,Params插件将返回一个以其名称为键的值数组。

例:

$allGetValues = $this->params()->fromQuery(); // empty method call

访问http://example.com/?orderby=birthdate&filter=hasphone时, $ allGetValues将是一个数组,例如

array(
    'orderby' => 'birthdate',
    'filter'  => 'hasphone',
);

 

不使用Params插件

如果检查Params插件的源代码,您会发现它只是其他控制器的薄包装,可以实现更一致的参数检索。如果出于某种原因想要/需要直接访问它们,则可以在源代码中看到它是如何完成的。

例:

$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');

注意:您可能已经使用了超全局变量$ _GET,$ _ POST等,但是不建议这样做。


4
也可以直接调用params插件,它是fromRoute()的快捷方式:$this->params('key', 'default')
罗宾

@Robin是真的。请注意,您不能使用它来获取所有路由参数,因为不带参数调用它将返回Params插件,而不是路由内容。
Matsemann

1
单元测试的+1 +注释+链接。出于某种原因,很少有人考虑签出单元测试。
Xunnamius

4

例如,获取发布的json字符串最简便的方法是读取'php:// input'的内容,然后对其进行解码。例如,我有一条简单的Zend路线:

'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
            'options' => array(
                'route'    => '/save-json/',
                'defaults' => array(
                    'controller' => 'CDB\Controller\Index',
                    'action'     => 'save-json',
                ),
            ),
        ),

我想使用Angular的$ http.post向其发布数据。该帖子很好,但是Zend中的检索方法

$this->params()->fromPost('paramname'); 

在这种情况下什么也没得到。所以我的解决方案是,在尝试了$ _POST之类的各种方法以及上述其他方法之后,从'php://'中读取:

$content = file_get_contents('php://input');
print_r(json_decode($content));

我最后得到了我的json数组。希望这可以帮助。


1
如果需要原始POST正文,请使用请求对象的getContent()。通过控制器,您可以执行以下操作:$content = $this->getRequest()->getContent()
Torin Finnemann

在ZF2上,我们如何检索形式为URL的URL参数?name=mike
Stephane

1
require_once 'lib/Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));

$loader->registerNamespace('Http\PhpEnvironment', 'lib/Zend/Http'); 

// Register with spl_autoload:
$loader->register();

$a = new Zend\Http\PhpEnvironment\Request();
print_r($a->getQuery()->get()); exit;


0

如果您无法访问控制器外部的实例插件,则可以像这样从servicelocator获取参数

//from POST
$foo = $this->serviceLocator->get('request')->getPost('foo'); 
//from GET
$foo = $this->serviceLocator->get('request')->getQuery()->foo;
//from route
$foo = $this->serviceLocator->get('application')->getMvcEvent()->getRouteMatch()->getParam('foo');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.