2016-12-30 2 views
1

У меня есть приложение, оно отлично работает. Но теперь мы решили перенести его на путь /api. Поэтому я использую detourКак запустить Mojolicious appication в пути '/ api' (как игнорировать некоторый префикс в пути)?

my $r = $self->routes; 

# Application is always under /api/v1, /api/v2 etc. path 
$r = $r->any('/api/:api', [ api => qr/v\d+/ ])->detour('MyApp'); 

$r->get('/users/me')->to('user#show_me'); 

Но после этого ничего не работает. Запрос на site.domain/api/v1 заставляет приложение попадать в бесконечный цикл.

Существует также Mojolicious::Plugin::Mount, но это полезно только для mount another one application по указанному маршруту.

This руководство тоже не разрешает проблема.

ответ

6

Эта линия должна быть установлена:

# Application is always under /api/v1, /api/v2 etc. path 
$r = $r->any('/api/:api', [ api => qr/v\d+/ ])->partial(1) 

Update
Как это было documented:

Маршрут не имеет конкретного конца, остальные символы будут захвачены в пути.

При запуске myapp.pl routes -v вы увидите:

/api/:api  .D.. *  apiapi  ^\/api/((?^:v\d+)) 
    +/users/me .... GET  usersme  ^\/users\/me/?(?:\.([^/]+))?$ 

Когда запрос пришел он будет проверен на этом регулярное выражение:

^\/api/((?^:v\d+))\/users\/me/?(?:\.([^/]+))?$ 

Где будет захвачен только /users/me в path

+0

Почему это работает? – simbabque

+0

@simbabque: см. Обновление –

+1

Это более полезно, спасибо :) – simbabque

Смежные вопросы