无法使用haxe.Web.Dispatch进行默认操作

时间:2013-08-07 20:47:16

标签: haxe

我目前正在使用haxe targeting php建立一个网站,我遇到了haxe.Web.Dispatch库的问题。

在我尝试实施doDefault()规则之前,一切运行良好。

我的调度api中有以下规则:

doIndex(){ ... }

doPosts(){y:String, m:String, n:String){ ... }

这些都会重定向到正确的网页。例如,这两种方法都可以正常工作:

http://foo.com/index
http://foo.com/posts/2013/01/post-title

现在我已经实施了

doDefault() {...}

为了将任何其他网址重定向到404网页,但它无效。转到上面的URL仍然可以正常工作,但转到

http://foo.com/bar

给出以下错误

uncaught exception: DETooManyValues

in file: C:\wamp\www\website\bin\lib\haxe\web\Dispatch.class.php line 191
#0 C:\wamp\www\website\bin\lib\Index.class.php(9): haxe_web_Dispatch->runtimeDispatch(Object(_hx_anonymous))
#1 C:\wamp\www\website\bin\lib\Index.class.php(12): Index->__construct()
#2 C:\wamp\www\website\bin\index.php(9): Index::main()
#3 {main}

调度documentation

  

如果在api上找不到相应的方法doXXXX   对象,或者如果URL是/,则使用动作doDefault。一个   异常DispatchError.DENotFound(“XXXX”)如果没有则抛出   默认操作(XXXX这里是URL部分的占位符   名称)。

但它没有说明DETooManyValues异常。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您要分派的网址比匹配操作的部分多,则会引发DETooManyValues错误。

所以如果你有:

doPage( name:String );

然后默认情况下“/ page / aboutus /”会起作用,但“/ page / aboutus / 2 /”不会。这也适用于doDefault() - “/”将起作用,“/ bar”不会(默认情况下)。

让它发挥作用的诀窍是使用“Dispatch”参数。

doPage( name:String, d:haxe.web.Dispatch ) {
    trace('Get page $name, with other parts: ${d.parts}');
}
doDefault( d:haxe.web.Dispatch ) {
    trace('Get page $name, with other parts: ${d.parts}');
}

如果Dispatch知道你的action /方法有这个dispatch参数,那么它假定你的方法知道如何处理额外的值,并且不再抛出错误。您可以使用d.parts数组访问额外部分。

已添加奖金:

您还可以使用d:Disaptch参数:

// Redirect to a different page, same get/post parameters
d.redirect("/differentpage/", d.params); 

// Redirect to a different controller.  If this is in /doDefault/, the whole URL is passed to the sub-controller.  
// If it is in `doPage` and the URL is /page/some/other/part, only `/some/other/part` will be passed on.
d.dispatch(new SomeOtherController()); 

我有一篇博文,如果您有兴趣,可以解释更多内容:

http://jasononeil.com.au/2013/05/29/creating-complex-url-routing-schemes-with-haxe-web-dispatch/

也可以随时提出问题,总是热衷于帮助其他人使用Haxe网站:)