98

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

4

5 回答 5

206

最简单的方法是使用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 等,但不鼓励这样做。

于 2012-08-22T16:05:25.380 回答
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 数组。希望这可以帮助。

于 2014-04-10T08:24:01.020 回答
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;
于 2015-12-08T20:18:33.097 回答
0

如果您无权访问控制器之外的插件,您可以像这样从服务定位器获取参数

//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');
于 2019-02-07T08:07:51.443 回答
0

如果您的内容类型是“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

于 2019-03-31T06:17:51.123 回答