0

のようなApigility URLがあるとしますlocalhost:8888/user

しかし、1 つのApigilityプロジェクトにApiOneApiTwoという 2 つの API があります。

GETからリクエストを行うと、localhost:8888/userApiTwo によって生成されたリソースが常に返されます。しかし、別のDBからのものであるため、ApiOneから同じユーザーリソースを取得したい場合、取得できません。ApiOneにアクセスするために、Acceptメディアタイプに適切なバージョンを提供しようとしました(それが役立つことを願っています)(例Accept application/vnd.apione.v1+json

4

1 に答える 1

1

あなたの質問に基づいて、/user へのルートを持つ ApiOne と /user へのルートを持つ ApiTwo を持っていると思いますか?

問題は、それらが異なるルートではないことです。ZF2 は、結合された構成ファイルで最後に定義されたものを使用します (私は信じています)。両方の API リソースを使用できるようにする場合は、何らかの方法で別のルートを用意する必要があります。これは文字通り、そのうちの 1 つを のようなものに変更する可能性があります/user1

エンティティを識別可能にする ID に制約を指定すると、理論的にはエンティティの 2 つの異なるエンドポイントにルーティングすることもできます。つまり、次のような両方のルートを持つことができます。

/api/user[/:user_id]

/api/user[/:user_name]

ZF2 ルーターに関する限り、この時点では、これらのルートは同一です。可変部分の user_id と user_name は同じものである可能性があります。

ただし、ルートを異なるものにする何かが必要になります。敏捷性 (および ZF2) により、URL の一部に対する制約が可能になります。したがって、user_id に [0-9]+ の制約を、user_name に [az]+ の制約を設定できます。これらにより、ルートはエンティティに対して相互に排他的になりますが、ルートのコレクション バージョンは同じままです。

制約は、次のようにオプションの下のルートに追加されます。


'router' => array(
        'routes' => array(
            'your-api.rest.user' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/user[/:user_id]',
                    'defaults' => array(
                        'controller' => 'YourApi\\V1\\Rest\\User\\Controller',
                    ),
                    'constraints' => array(
                        **'user_id' => '[0-9]+'**,
                    ),
                ),
            ),
            'your-api.rest.username' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/user[/:user_name]',
                    'defaults' => array(
                        'controller' => 'YourApi\\V1\\Rest\\Username\\Controller',
                    ),
                    'constraints' => array(
                        **'user_name' => '[a-z]+'**,
                    ),
                ),
            ),
        ),
    ),
)

この例では、user_id または user_name が指定されていない場合、最後に定義されている Username リソースを呼び出す必要があります。

ただし、全体として、ルートを変更して異なるものにすることをお勧めします。バージョン付きの受け入れヘッダーは、基本的にバージョン管理に使用され、別の API リソースにルーティングされません。

于 2015-05-14T05:28:07.217 に答える