2

RestlerWebサイトにある「Say」クラスの例から派生した非常に単純なクラスがあります。それは次のとおりです。

 <?php
class Say {
  function hello($to='world') {
    return "Hello $to!";
  }
  function hi($to) {
    return  "Hi $to!";
  }

  function nothing($to='the ground') {
    return "Looks at {$to} quietly but without saying a word.";
  }
}

「hi」関数には$to変数のデフォルト値がないため、主に次のように機能します。

http://localhost/api/say/hi/Jack

戻り値

こんにちはジャック!

素晴らしい。問題は、「hello」関数や「nothing」関数などのデフォルト値がある場合、パラメーターを渡すことができなくなったように見えることです。

http://localhost/api/say/hello          -- WORKS, returns "Hello world!"
http://localhost/api/say/hello/Jack     -- FAILS, returns a JSON error of 404

どんな助けでも大歓迎です。

ちなみに、 "hi"でパラメーターを使用しない場合($を何かに設定する必要があります)、404エラーも返されることにも気づきました。それが予期された動作であるかどうかはわかりませんが、この種のエラーに対する間違ったエラーメッセージのようです。

4

1 に答える 1

3

Restler 2 は期待どおりに機能しました。上記の hello メソッドでは、次のルートが生成されます

GET say/hello      ⇠ Say::hello()
GET say/hello/{to} ⇠ Say::hello()

しかし、Restler 3 は 1 つのルートしか作成しません。

GET say/hello   ⇠ Say::hello()

これは、オプションのパラメーターを URL にマップしないスマート ルーティングが原因で発生しているため、オプションのパラメーターをクエリ文字列として渡すことができます。

hi メソッドの場合、Restler 2 は次のようにルーティングします。

GET say/hi      ⇠ Say::hi()
GET say/hi/{to} ⇠ Say::hi()

Restler 3としてどこに

GET say/hi/{to} ⇠ Say::hi()

したがってsay/hi、必要なパラメーターが欠落しているため、失敗します

これを行う理由は、あいまいさを避けるためです。ここのルーティング例で説明されています

Restler 3 のすべての API に対して Restler 2 の動作が必要な場合は、次を index.php に追加します。

Defaults::$smartAutoRouting = false;

メソッド レベルまたはクラス レベルでスマート自動ルーティングをオフにするだけの場合は、次の php doc コメントを追加します。

@smart-auto-routing false
于 2012-10-11T01:54:27.990 に答える