0


0

私はRESTサービスのためのいくつかの経路を書いています。 私のリソースのURIの1つはこのように見えます

resources / user /:id

私はまた、ユーザーの個々の属性へのアクセスを与えたいと思います。

resources / user /:id /:属性

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

routes.user.route = "resources / user /:id" routes.user.defaults.controller =ユーザー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 = "レビュー|リスト"

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

エラーが発生しましたページが見つかりません例外情報:

メッセージ:無効なコントローラが指定されました(リソース)スタックトレース:

#0 /usr/local/lib/ZendFramework/ZendFramework-1.7.1-minimal/library/Zend/Controller/Front.php(934):Zend_Controller_Dispatcher_Standard-> dispatch(オブジェクト(Zend_Controller_Request_Http)、オブジェクト(Zend_Controller_Response_Hp)/オブジェクト(Zend_Controller_Response_Hp)/#ホーム/ baileyp / public_html / web / index.php(50):Zend_Controller_Front-> dispatch()#2 {main}

リクエストパラメータ:

array(4){["controller"] => string(9) "resources" ["action"] => string(4) "user" [10] => string(7) "reviews" ["module"] =>文字列(7) "デフォルト"}

それで、それは明らかに私の2番目の経路を正しく処理していません、なぜならそれはコントローラーが "リソース"でアクションが "ユーザー"だからです。 私はここで何をしていますか? Zendサイトには、これを実装する方法を示す例はありません。

そして、これを実現するためだけにモジュールを使用したくはありません。フォルダの作成を避け、URIと一致させることだけがルーティングシステムの目的です。

2 Answer


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 = "レビュー|リスト"

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

私は同様の問題を抱えていて、それが私の問題を解決しました!


1


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

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

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

この呼び出しで:

foo.com/resources/user/12345/

デフォルトの属性値を仮定します。

foo.com/resources/user/12345//

空白の値はあなたのWebサーバによって取り除かれるかもしれません(apacheは複数のスラッシュを単一のスラッシュとして扱います)ので、属性を名前で呼ばれるものにデフォルト設定することをお勧めします。そしてそれはindex.htmlファイルのように機能します。フォルダ:

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"

結果にも影響する可能性があります。 お役に立てれば。