如何访问Zend Framework 2中的route、post、get等参数


How to access route, post, get etc. parameters in Zend Framework 2

如何在zf2中获取与页面请求相关的各种参数?像post/get参数一样,访问的路由、发送的头和上传的文件。

最简单的方法是使用在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的值为出生日期
访问时http://example.com/,$orderBy将具有默认名称

获取所有参数

要获取一种类型的所有参数,只需不传入任何内容,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等,但这是不鼓励的。

例如,获取已发布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数组。希望这能有所帮助。

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;

如果您的内容类型是"application/-www form urlended",则上述所有方法都可以正常工作。但是,如果您的内容类型是"application/json",则必须执行以下操作:

$params=json_decode(file_get_contents('php://input'),true);print_r($params);

原因:请参阅中的#7https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

如果您无法访问插件,例如控制器之外的插件。您可以从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');