0

RESTサービスのルートをいくつか書いています。私のリソースのURIの1つは次のようになります

resources / user /:id

また、ユーザーの個々の属性へのアクセスを許可したいのですが、これは次のようになります。

resources / user /:id /:attribute

しかし、後者のルートを定義しようとすると、機能しません。これがルートが定義されている私のiniです

routes.user.route = "resources/user/:id"
routes.user.defaults.controller = user
routes.user.defaults.action = get
routes.user.defaults.id = 0
routes.user.reqs.id = "\d+"

routes.user_attribute.route = "resources/user/:id/:attribute/"
routes.user_attribute.defaults.controller = user
routes.user_attribute.defaults.action = getAttribute
routes.user_attribute.defaults.id = 0
routes.user_attribute.defaults.attribute = ""
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"

ブラウザでresources/user / 4 / reviewsにアクセスしようとすると、次の出力が表示されます。

An error occurred
Page not found
Exception information:

Message: Invalid controller specified (resources)
Stack trace:

#0 /usr/local/lib/ZendFramework/ZendFramework-1.7.1-minimal/library/Zend/Controller/Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#1 /home/baileyp/public_html/web/index.php(50): Zend_Controller_Front->dispatch()
#2 {main}

Request Parameters:

array(4) {
  ["controller"]=>
  string(9) "resources"
  ["action"]=>
  string(4) "user"
  [10]=>
  string(7) "reviews"
  ["module"]=>
  string(7) "default"
}

つまり、コントローラーが「リソース」であり、アクションが「ユーザー」であるため、2番目のルートが正しく処理されていないことは明らかです。私はここで何が間違っているのですか?これを実装する方法を説明する例は、私が見つけたZendサイトにはありません。

そして、私はこれを行うためだけにモジュールを使用したくありません-URIに一致するようにフォルダーなどの作成を回避することは、ルーティングシステムの全体的な目的です。

4

2 に答える 2

1

ルールの順序のみを変更する必要があると思います...したがって、最初に、より具体的なルールを一番上に配置し、より一般的なルールを一番下に配置します!

routes.user_attribute.route = "resources/user/:id/:attribute/"
routes.user_attribute.defaults.controller = user 
routes.user_attribute.defaults.action = getAttribute
routes.user_attribute.defaults.id = 0
routes.user_attribute.defaults.attribute = ""
routes.user_attribute.reqs.id = "\d+"
routes.user_attribute.reqs.id = "reviews|lists"

routes.user.route = "resources/user/:id"
routes.user.defaults.controller = user
routes.user.defaults.action = get
routes.user.defaults.id = 0
routes.user.reqs.id = "\d+"

同様の問題があり、問題が解決しました!

于 2008-12-17T22:14:03.457 に答える
1

これらの両方を並べて定義しているかどうかはわかりません。私の経験では、マッピングしようとしている最初のルートは、実際には2番目にうまく処理されます( に指定したデフォルト値のおかげですattribute)。

したがって、このルート:

foo.com/resources/user/:id/:attribute

この呼び出しで:

foo.com/resources/user/12345/

デフォルトの属性値を想定します:

foo.com/resources/user/12345//

空白の値は Web サーバーによって削除される可能性があるため (Apache は複数のスラッシュを 1 つのスラッシュとして扱います)、属性を名前で呼び出すことができるものにデフォルト設定することをお勧めします。フォルダ:

foo.com/resources/user/12345/
foo.com/resources/user/12345/general/ (same result)

私がトラブルシューティングを行った中で最も幸運だったのは、ルートのデフォルト値と要件を 1 行ずつ順番にコメントアウトしたことです。ルート自体の「エッジ」が表示されることになります(情報を少なくすると、デフォルトにフォールバックするため)。

また、あなたの例では、id要件を 2 回定義していることに注意してください。

 routes.user_attribute.reqs.id = "\d+"
 routes.user_attribute.reqs.id = "reviews|lists"

次のように調整されます。

 routes.user_attribute.reqs.id = "\d+"
 routes.user_attribute.reqs.attribute = "reviews|lists"

あなたの結果にも影響を与える可能性があります。お役に立てれば。

于 2009-02-16T15:18:45.573 に答える