Answers:
最简单的方法是使用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插件的源代码,您会发现它只是其他控制器的薄包装,可以实现更一致的参数检索。如果出于某种原因想要/需要直接访问它们,则可以在源代码中看到它是如何完成的。
$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数组。希望这可以帮助。
$content = $this->getRequest()->getContent()
?name=mike
?
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-urlencoded”,则上述所有方法都可以正常工作。但是,如果您的内容类型为“ application / json”,则必须执行以下操作:
$ params = json_decode(file_get_contents('php:// input'),true); print_r($ params);
原因:参见https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make中的#7
如果您无法访问控制器外部的实例插件,则可以像这样从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');
$this->params('key', 'default')