1

路由时 - 我如何确保某些查询参数存在并且是数字的?
例如 - 这是路线:

'route' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/simple_route',
        'defaults' => array(
            'controller' => 'Application\Controller\IndexController',
            'action' => 'simpleRoute'
        )
    ),
),  

我如何确保var1var2查询参数存在并且是数字的?如果不存在 - 我将如何将它们设置为 routematch 中的一些默认值?

这应该工作:

/simple_route?var1=10&var2=15

这应该有效:

/simple_route?var1=20&var2=352

但是当不是数字时 - var2 应该设置为一些数字默认值:

/simple_route?var1=10&var2=aabbcc
4

2 回答 2

2

查询参数不是路由机制的一部分并且被路由器忽略,因此您不能在路由器配置中对它们设置任何约束。您可以在操作中检查查询参数的正确性。IE

public function myAction()
{
    $var1 = $this->getRequest()->getQuery('var1');
    if ($var1 === null || !is_numeric($var1)) {
        throw new \InvalidArgumentException('var1 is invalid');
    }
}

编辑:

似乎确实有一条查询路线,但不可能在参数上添加约束。所以我验证参数的解决方案仍然是正确的。

于 2013-02-28T22:09:50.687 回答
0

出于安全原因,不推荐使用查询路由并且不应使用(它实际上也不匹配任何东西,因此它不能解决手头的问题)。

TLDR;这种模式不是 RESTful 的,所以 ZF2 的人不想鼓励它。相反,推荐的策略是创建一个基于查询参数重定向的操作。我实际上试图替换这种方法,但已经恢复到它。

===

如果你想/需要支持它,我在搜索过程中开发了一个具有这些功能的自定义路由。你可以做类似的事情。

不幸的是,有一些陷阱。关键的一个是当它跑出路径时,Route 会停止寻找。例如,如果您将 uri 发送login.php?logout=true到 的 Literal 路由login.php,它将:

  • 匹配 login.php
  • 意识到没有路径可以匹配并且
  • 停止搜索(即使 $may_terminate 设置为 false)

这意味着它永远不会到达 QueryFilter 有任何机会匹配logout=true。我发现克服这个问题的最好方法是留下一个角色。例如,Literallogin.ph将留下一个 finalp需要匹配并继续搜索和匹配 QueryFilter。这很丑陋,但它有效。

当我决定不使用 QueryFilter 时,我放弃了它。如果您决定使用它而不是 RESTful 反对意见,我建议您进行一些升级:

  • 替换existscontains使用模式param => bool。这会让您说查询字符串必须包含 ( true) 或排除 ( false) 特定的param.
  • array_key_exists逻辑添加到该constraints部分。

OP 的情况可以通过将contains规则var1 => trueconstraints规则相结合来解决var1 => '[0-9]+'

于 2015-04-06T18:05:42.340 回答