Zend framework2 Zf2。文字路由-如何确保查询参数存在且为数字?

Zend framework2 Zf2。文字路由-如何确保查询参数存在且为数字?,zend-framework2,Zend Framework2,路由时-如何确保某些查询参数存在且为数字? 例如,以下是路线: 'route' => array( 'type' => 'literal', 'options' => array( 'route' => '/simple_route', 'defaults' => array( 'controller' => 'Application\Controller\IndexController'

路由时-如何确保某些查询参数存在且为数字?
例如,以下是路线:

'route' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/simple_route',
        'defaults' => array(
            'controller' => 'Application\Controller\IndexController',
            'action' => 'simpleRoute'
        )
    ),
),  
如何确保
var1
var2
查询参数存在且为数字?如果不存在,我将如何在routematch中将它们设置为一些默认值

这应该起作用:

/simple_route?var1=10&var2=15
/simple_route?var1=20&var2=352
这应该是可行的:

/simple_route?var1=10&var2=15
/simple_route?var1=20&var2=352
但如果不是数值-var2应设置为某个数值默认值:

/simple_route?var1=10&var2=aabbcc

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

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

看起来确实存在,但不可能在参数上添加约束。因此,我验证参数的解决方案仍然是正确的。

查询路由已被弃用,不应使用(它实际上与任何内容都不匹配,因此无法解决当前的问题)。

TLDR;这种模式不是RESTful的,所以ZF2的人不想鼓励它。相反,建议的策略是创建一个基于查询参数重定向的操作。实际上,我试图取代这种方法,但现在又回到了原来的方法

===

如果您希望/需要支持它,我在搜索过程中开发了一个具有这些功能的应用程序。你也可以做类似的事情

不幸的是,这里有陷阱。关键的一点是,当路线超出路径时,它会停止寻找。例如,如果您将uri
login.php?logout=true
发送到
login.php
的文本路由,它将:

  • 匹配login.php
  • 意识到已经没有路可走了
  • 停止搜索(即使$may\u terminate设置为false)
这意味着它永远不会到达QueryFilter以有机会匹配
logout=true
。我发现解决这个问题的最好办法就是去掉一个角色。例如,Literal
login.ph
将留下需要匹配的最终
p
,并继续搜索和匹配QueryFilter。这是丑陋的,但它的工作

当我决定不使用QueryFilter时,我放弃了它。如果您决定在RESTful上使用它,我建议您进行一些升级:

  • 使用模式
    param=>bool
    exists
    替换为
    contains
    。这将允许您说查询字符串必须包含(
    true
    )或排除(
    false
    )特定的
    参数
    
  • array\u key\u exists
    逻辑添加到
    约束
    部分

OP的情况可以通过将
包含
规则(如
var1=>true)与
约束(如
var1=>'[0-9]+'
等)相结合来解决-那么-如果不能使用“查询”路由,为什么会有“查询”路由呢?。。但我想这是另一个问题——我会单独问。谢谢。谢谢你指向“查询”路线,我不知道它存在。我已经编辑了我的回复帖子。