zend framework 3-获取具有空格的urlencoded路由参数

时间:2018-08-18 23:59:21

标签: parameters routes urlencode zend-framework3 php-7.1

在Zend Framework 3中,我具有以下细分路线:

'route' => '/search/:query'

在控制器中,我得到这样的查询:

$query = $this->params()->fromRoute('query');

我注意到这不适用于包含空格的查询。对于以下两个URL,该查询均以foo+bar的形式检索。

https://www.example.com/search/foo+bar
https://www.example.com/search/foo%2Bbar

但是,第一个查询应解释为foo bar,而不是foo+bar

目前,我们正在使用一种直接解析$_SERVER['REQUEST_URI']的变通方法:

$queryEncoded = explode('/', $_SERVER['REQUEST_URI'])[2];
$query        = urldecode($queryEncoded);

在这种情况下,Zend Framework 3是否提供了一种本机方法来正确检索query参数?

1 个答案:

答案 0 :(得分:0)

您正在混合Route参数和线段。

下面是2条路线,1条文字,1条路段的示例:

'router' => [
    'routes' => [
        'users' => [
            'type'          => Literal::class,
            'may_terminate' => true,
            'options'       => [
                'route'    => '/users',
                'defaults' => [
                    'controller' => UserIndexController::class,
                    'action'     => 'index',
                ],
            ],
            'child_routes'  => [
                'view' => [
                    'type'          => Segment::class,
                    'may_terminate' => true,
                    'options'       => [
                        'route'       => '/:id',
                        'constraints' => [
                            'id' => '[0-9]+',
                        ],
                        'defaults'    => [
                            'controller' => UserViewController::class,
                            'action'     => 'view',
                        ],
                    ],
                ],
                // more routes
            ],
            // more routes
        ],
    ],
],

所以这里有路线:

  • “用户”,已转换为网址中的/users(文字)
  • “视图”,已翻译为URL(段)中的/:id

后者是一个段。它也有一些限制:它必须是任意数量的正数。

因此,我们具有ID的用户(索引)和特定视图(视图)。示例网址:

  • example.com/users
  • example.com/users/12
  • example.com/users/123

请注意,由于它是已定义路由的一部分,并且是在约束中定义的,因此您将在像这样的控制器中获得这些示例中给出的id

$id = $this->params()->fromRoute('id', null);

这为您提供了在路由中传递的idnull值。

您要在问题中尝试的是针对条件视图或搜索的内容。您需要参数。您想要:

  • example.com/users?role=admin

这为您提供了一个key“角色”和一个value“管理员”。在上下文中,您希望显示所有具有admin角色的用户。

您未在路由中定义键/值类型。根本没有必要。 Zend Router确保使用以下命令为请求中准备的所有内容进行准备:

$queryParams = $this->params()->fromQuery('role', null);

请注意将fromRoute更改为fromQuery?之后的所有内容均为查询内容。 Zend Router通过密钥名称为您准备使用这些文件。 role

查询键/值的准备还考虑了空格。如果您具有以下网址:

  • example.com/users?foo=space%20bar&role=admin

您将得到以下结果:

$foo  = $this->params()->fromQuery('foo', null);   // "space bar"
$role = $this->params()->fromQuery('role', null'); // "admin"
$test = $this->params()->fromQuery('test', null'); // null