9

Zend Frameworkを使用して、次のパターンで編成されたリソース上にRESTAPIのルートを構築しようとしています。

Zend_Rest_Routeでこれを設定するにはどうすればよいですか?

bootstrap.phpファイルでユーザーリソース(users /:id)のルートを設定する方法は次のとおりです。

  $this->bootstrap('frontController');
  $frontController = Zend_Controller_Front::getInstance();
  $restRoute = new Zend_Rest_Route($frontController);
  $frontController->getRouter()->addRoute('default', $restRoute);

[私が理解している限り、これはキャッチオールルートであるため、users / 324 / items/34のパラメーターはid=324およびitems=34に設定され、すべてがユーザー(フロントモジュール)モデルにマップされます。そこから、itemsパラメーターをテストし、getリクエストでユーザー#324のアイテム#34を取得できると思います。] <===チェックしたところ、次のようには機能しないようです。

/ users / 234 / items/43へのアクセスと

var_dump($this->_getAllParams());

Restコントローラーのgetアクションでは、次の出力が生成されます。

array(4) {
 ["controller"]=> string(5) "users"
 ["action"]=>  string(3) "get"
 [2]=>  string(5) "items"  ["module"]=>  string(7) "default"]
}

どういうわけか両方のIDが失われました...

誰?

4

3 に答える 3

6

このソリューションを github にオープンソース化し、composer パッケージとして提供しました。https://github.com/aporat/Application_Rest_Controller_Routeを参照してください。

Zend_Controller_Router_Route を拡張し、次のようなカスタムの安らかなルートを追加する機能を追加する新しいクラスを追加しました。

$frontController = Zend_Controller_Front::getInstance();
$frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages']));
于 2013-03-25T21:11:55.923 に答える
5

私の知る限り、Zend_Rest_Routeには、このようなことを可能にする機能はありません。提案はありますが、いつ実装されるかはわかりません。これを Bootstrap に追加して、このカスタム ルートを設定できます。

$front = $this->getResource('FrontController'); 
$testRoute = new Zend_Controller_Router_Route(
    'users/:user_id/items/:item_id',
    array(
        'controller' => 'users',
        'action' => 'item',
        'module' => 'default'
    )
);

$front->getRouter()->addRoute('test', $testRoute);

user_idまたはitem_idは、UsersController の itemAction でパラメーターとして使用できるようになります。

$user_id = $this->_request->getParam('user_id');
于 2010-03-08T06:48:37.700 に答える
3

Zend_Rest_Route は、パラメーターが 1 つの場合にのみ、コントローラー名の後の最初のパラメーターを 'id' にマップします。

私が思いついた最善の解決策は、Zend_Rest_Route をサブクラス化し、match() 関数をオーバーライドすることです。Zend_Rest_Route の match 関数をコピーしますが、"Digest URI Params" コメントの直前 (約 60 行) に以下を追加します。

if($pathElementCount > 1 && $path[0] != 'id') {
    $params['id'] = urldecode($path[0]);
    array_shift($path);
}  

これにより、探している機能が提供されるはずです。

于 2012-02-27T23:40:52.083 に答える