【问题标题】:How to access route, post, get etc. parameters in Zend Framework 2Zend Framework 2中如何访问route、post、get等参数
【发布时间】:2017-05-22 04:48:51
【问题描述】:

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

【问题讨论】:

    标签: php file-upload zend-route zend-framework2


    【解决方案1】:

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

    获取单个值

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

    示例:

    $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 插件

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

    示例:

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

    注意:您可以使用超全局变量 $_GET、$_POST 等,但不鼓励这样做。

    【讨论】:

    • 直接调用params插件也是可以的,是fromRoute()的快捷方式:$this->params('key', 'default')
    • @Robin 这是真的。请注意,您不能使用它来获取所有路由参数,因为不带参数调用它会返回 Params 插件而不是路由内容。
    • +1 用于单元测试评论+链接。很少有人会出于某种原因考虑检查单元测试。
    【解决方案2】:

    例如,获取已发布的 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 中的 retrive 方法

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

    在这种情况下没有得到任何东西。所以我的解决方案是,在尝试了各种方法(如 $_POST 和上述其他方法)之后,从 'php://' 读取:

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

    最后我得到了我的 json 数组。 希望这会有所帮助。

    【讨论】:

    • 如果您需要原始 POST 正文,请使用请求对象的 getContent()。从控制器,你可以这样做:$content = $this->getRequest()->getContent()
    • 在ZF2上如何获取?name=mike形式的URL参数?
    【解决方案3】:
    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;
    

    【讨论】:

      【解决方案4】:

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

      //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');
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          相关资源
          最近更新 更多