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的人不想鼓励它。相反,建议的策略是创建一个基于查询参数重定向的操作。实际上,我试图取代这种方法,但现在又回到了原来的方法
===
如果您希望/需要支持它,我在搜索过程中开发了一个具有这些功能的应用程序。你也可以做类似的事情
不幸的是,这里有陷阱。关键的一点是,当路线超出路径时,它会停止寻找。例如,如果您将urilogin.php?logout=true
发送到login.php
的文本路由,它将:
- 匹配login.php
- 意识到已经没有路可走了
- 停止搜索(即使$may\u terminate设置为false)
logout=true
。我发现解决这个问题的最好办法就是去掉一个角色。例如,Literallogin.ph
将留下需要匹配的最终p
,并继续搜索和匹配QueryFilter。这是丑陋的,但它的工作
当我决定不使用QueryFilter时,我放弃了它。如果您决定在RESTful上使用它,我建议您进行一些升级:
- 使用模式
将param=>bool
替换为exists
。这将允许您说查询字符串必须包含(contains
)或排除(true
)特定的false
参数李>
- 将
逻辑添加到array\u key\u exists
部分约束
- 将
OP的情况可以通过将
包含规则(如var1=>true)与约束(如var1=>'[0-9]+'
等)相结合来解决-那么-如果不能使用“查询”路由,为什么会有“查询”路由呢?。。但我想这是另一个问题——我会单独问。谢谢。谢谢你指向“查询”路线,我不知道它存在。我已经编辑了我的回复帖子。