1

現在、haxe ターゲティング php を使用して Web サイトをセットアップしていますが、haxe.Web.Dispatchライブラリに問題があります。

doDefault() ルールを実装しようとするまで、すべてがうまく機能していました。

ディスパッチ API には次のルールがあります。

doIndex(){ ... }

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

そして、これらは両方とも正しい Web ページにリダイレクトされます。たとえば、これらは両方とも正常に機能します。

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

そして今、私は実装しました

doDefault() {...}

他の URL を 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}

ディスパッチのドキュメントによると

対応するメソッド doXXXX が api オブジェクトで見つからない場合、または URL が / の場合、代わりにアクション doDefault が使用されます。デフォルトのアクションがない場合、例外 DispatchError.DENotFound("XXXX") がスローされます (ここでの XXXX は URL 部分名のプレースホルダーです)。

しかし、DETooManyValues 例外については何も述べていません。誰にもアイデアはありますか?

4

1 に答える 1

1

DETooManyValuesディスパッチしている URL に一致するアクションよりも多くの部分がある場合、エラーがスローされます。

あなたが持っている場合:

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は、メソッドが余分な値を処理する方法を知っていると想定し、エラーをスローしなくなります。配列を使用して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 を使用している他の誰かを助けたいと思っているので、気軽に質問を続けてください :)

于 2013-08-07T23:38:08.903 に答える