Мы пытаемся сделать наш REST API более дружественным, у нас есть базовый класс для нашего REST API, который наследуется от Catalyst :: Controller :: REST. Каждый класс REST может идентифицировать параметры запроса, которые он принимает. Мы подумали, что было бы неплохо сделать эту информацию общедоступной и поместить ее в базовый класс:
sub doc : Regex('/doc$') {
my ( $self, $c ) = @_;
$c->stash->{params} = $c->forward('allowed_query_params');
}
И оттуда к каждому URL REST можно добавить / doc / в конец, чтобы показать, какие параметры запроса он принимает.
Это не работает. $ self - это всегда экземпляр PIPs :: C :: API :: V1 :: Franchise, независимо от того, какой URL вызывается. Это, кажется, из-за них:
[26 Feb 2009 15:07:40,509] [Catalyst.Dispatcher] [DEBUG] Loaded Private actions:
.-----------------------+--------------------------------------+--------------.
| Private | Class | Method |
+-----------------------+--------------------------------------+--------------+
...
| /api/v1/franchise/doc | PIPs::C::Api::V1::Franchise | doc |
И
[26 Feb 2009 15:07:40,514] [Catalyst.DispatchType.Regex] [DEBUG] Loaded Regex actions:
.--------------------------------------+--------------------------------------.
| Regex | Private |
+--------------------------------------+--------------------------------------+
| /doc$ | /api/v1/franchise/doc |
| /doc$ | /api/v1/version/doc |
| /doc$ | /api/v1/creditrole/doc |
| /doc$ | /api/v1/doc |
| /doc$ | /api/v1/segmentevent/doc |
| /doc$ | /api/v1/collection/doc |
| /doc$ | /api/v1/episode/doc |
Таким образом, самый первый экземпляр метода "doc" отправляется через франшизу, даже если контроллером для данного URL-адреса будет API :: V1 :: Version или что-то в этом роде.
Как я могу обойти это? Очевидно, LocalRegex не работает, и цепные действия не кажутся подходящими, потому что из-за природы нашего приложения мы никогда не знаем, сколько частей пути будет между '/ api / v1 /' и '/ doc /'.
Чего мне не хватает?