2

/user/group、などのいくつかの REST リソース エンドポイント/eventを個別のコントローラーとして定義しています。それらはすべてルート コントローラ ( App::Web::Controller::Root) から継承されます。リソース タイプを識別できるルート コントローラ内で、これらすべてのリソースの汎用エンドポイントを作成することは可能ですか?

私の主なユースケースは.../list、一般的に定義したい です。これは、その親リソースを識別し、リソース エンティティの配列を返します。例えば、

/user/list      # Array list of user entities
/group/list     # Array list of group entities
/event/list     # Array list of event entities

リソースを逆にするアクションを簡単に作成できます (たとえば、/list/event自然に によって処理されsub list_GETます)。

ありがとう!

4

1 に答える 1

0

リソースを識別するために私が使用しているアプローチは、各リソース コントローラーがそのリソースをスタッシュに定義し、汎用アクションがそのスタッシュ値を参照するようにすることです。

たとえば、各リソース コントローラで次のように指定します。

package App::Web::Controller::User;

sub begin :Auto {
    my ($self, $c) = @_;
    $c->stash(resource => 'User');
}

次に、ルートコントローラーで次のようにします。

package App::Web::Controller::Root;

sub list :Path('list') :ActionClass('REST') {}

sub list_GET {
    my ($self, $c) = @_;
    my $resource = $c->stash->{resource};
    return $self->status_ok($c, entity => {
        list => [ $c->model('App::' . $resource)->find->all ]
    });
}

すべてのコントローラーがそのリソースを定義する必要があるため、十分に一般的ではないため、これにはあまり満足していません。

于 2012-08-03T17:42:56.423 に答える