8

Zend を使用して Rest Controller を開発していますが、ルーターへの URL のマッピングについて混乱しています。

基本的に私はZend Routerについて読みましたが、言及されたルートを満たすためにURLを計画できませんでした。

これらは、ルーターにマップする必要がある私の URL の一部です。

  1. http://localhost/api/v1/tags.xml

  2. http://localhost/api/v1/tags.xml?abc=true (パラメーター: abc=true)

  3. http://localhost/api/v1/tags/123456.xml (パラメーター: 123456.xml)

  4. http://localhost/api/v1/tags/123456/pings.xml (パラメーター: 123456、pings.xml)

  5. http://localhost/api/v1/tags/123456/pings.xml?a=1&b=2 (パラメーター: 123456、pings.xml、a=1、b=2)

  6. http://localhost/api/v1/tags/123456/pings/count.xml (パラメーター: 123456、pings、count.xml)

URLパターン1~3は「tags」、URLパターン4~6は「pings」をコントローラーにしようと考えています。

上記のシナリオが機能するようにルーターを構成する方法がわかりません。これらの URL は変更できないことに注意してください。良い回答には私の評判スコアの 100 を提供できます。

4

2 に答える 2

6

最初の 2 つの URL を 1 つのルーターに結合できます。

$r = new Zend_Controller_Router_Route_Regex('api/v1/tags.xml',
                array('controller' => 'tags', 'action' => 'index'));
$router->addRoute('route1', $r);

最初の 2 つのルートを区別するには、タグ コントローラーに abc パラメーターが存在することを確認します。タグ コントローラの index アクションに次を追加します。

if($this->_getParam('abc') == "true")
{
//route 2
} else {
// route 1
}

同様に、ルート 4 と 5 は 1 つのルートに結合できます。

ルート 6 について説明しました。ルート 3 についても、同じロジックを使用できます。

$r = new Zend_Controller_Router_Route_Regex('api/v1/tags/(.*)/pings/(.*)',
                array('controller' => 'pings', 'action' => 'index'),
array(1 => 'param1',2=>'param2')
);
$router->addRoute('route6', $r);

パラメータは、pings コントローラで次のようにアクセスできます。

$this->_getParam('param1') and $this->_getParam('param2')

ルート 5 の場合:

$r = new Zend_Controller_Router_Route_Regex('api/v1/tags/(.*)/pings.xml',
                array('controller' => 'pings', 'action' => 'index'),
array(1 => 'param1')
);
$router->addRoute('route5', $r);

パラメータ (URL の ? の後の部分) は Router では処理されません。デフォルトでは、それらはコントローラーに渡されます。

URL で渡された特定のパラメーター値を取得するには、コントローラーで次を使用します。

$this->_getParam('a');

ロジックは、ルートで (.*) を使用し、それらにパラメーター名を割り当てて、コントローラーでそれらにアクセスすることです

于 2011-03-01T12:40:01.693 に答える
4

以下は、コントローラー、インデックス付きパラメーター、および拡張機能をリクエストから抽出するアルゴリズムの一部のスターターです。これを拡張バージョンに組み込むことができますZend_Rest_Route::match()

public function match( $request )
{
    $path = $request->getPathInfo();

    // distill extension (if any) and the remaining path
    preg_match( '~(?U:(?<path>.*))(?:\.(?<extension>[^\.]*))?$~', $path, $matches );
    $this->_values[ '_extension' ] = isset( $matches[ 'extension' ] ) ? $matches[ 'extension' ] : null;
    $path = isset( $matches[ 'path' ] ) ? $matches[ 'path' ] : '';

    // split the path into segments
    $pathSegments = preg_split( '~' . self::URI_DELIMITER . '~', $path, -1, PREG_SPLIT_NO_EMPTY );

    // leave if no path segments found? up to you to decide, but I put it in anyway
    if( 0 == ( $length = count( $pathSegments ) ) )
    {
        return false;
    }

    // initialize some vars
    $params = array();
    $controller = null;

    // start finding the controller 
    // (presumes controller found at segment 0, 2, 4, etc...)
    for( $i = 0; $i < $length; $i += 2 )
    {
        // you should probably check here if this is a valid REST controller 
        // (see Zend_Rest_Route::_checkRestfulController() )
        $controller = $params[] = $pathSegments[ $i ];
        if( isset( $pathSegments[ $i + 1 ] ) )
        {
            $params[] = $pathSegments[ $i + 1 ];
        }
    }
    // remove the param which is the actual controller
    array_splice( $params, $i - 2, 1 );

    // set the controller
    $this->_values[ 'controller' ] = $controller;

    // merge the params and defaults
    $this->_values = array_merge( $this->_values, $params, $this->_defaults );

    return $this->_values;
}

ほとんどテストされていないため、もちろん製品版ではありません。しかし、それはあなたを始めるはずです。

これにより、これまでに得られるものは次
のとおりです。 コントローラー
拡張機能
インデックス付きパラメーター

これがあなたに与えないものは次
のとおりです: アクション (post、put、delete など。このためのアルゴリズムは既に にありますZend_Rest_Route::match())
名前付きパラメーター (それは既に処理されていますZend_Controller_Request_Http)

編集
これまでのところ、この回答は少しあいまいであると考えられる可能性があることを認識しています。match()ポイントは、このアルゴリズムを のアルゴリズムとマージすることですZend_Rest_Route。しかし、上記のコードにはまだ多くの注意が必要です。おそらくモジュールも考慮したいでしょう( のようにZend_Rest_Route)、おそらくオプションの baseUrl でさえあります(ZFが実際にこれを内部でどのように処理するかはわかりません)。

于 2011-03-01T12:55:36.350 に答える