Можно ли использовать «-> to ()» в Mojolicious :: Lite? - PullRequest
0 голосов
/ 21 мая 2018

Я бы хотел использовать умеренное количество переадресации на другие контроллеры в приложении Mojolicious :: Lite.

Я думал, что мог бы использовать ->to ( docs ), чтобы что-то сделатькак

(get '/x')->to('Route#bar');

get '/y' => sub {
    my $c = shift;
    $c->render(text => 'here')
} => 'y';

app->start;

с кодом в пакете контроллера, похожим на это:

package Route::Controller::Route;

use Mojo::Base 'Mojolicious::Controller';

sub bar {
  my $self = shift;
  $self->render(json => { hello => 'simone' });
}

1;

, но не похоже, что http://localhost:3000/x возвращает 404 "страницу не найдена ... еще!"и http://localhost:3000/y работает нормально

Дамп журнала выглядит так:

[Wed May 23 11:39:47 2018] [debug] Template "route/bar.html.ep" not found
[Wed May 23 11:39:47 2018] [debug] Template "not_found.development.html.ep" not found
[Wed May 23 11:39:47 2018] [debug] Template "not_found.html.ep" not found
[Wed May 23 11:39:47 2018] [debug] Rendering cached template "mojo/debug.html.ep"
[Wed May 23 11:39:47 2018] [debug] Rendering cached template "mojo/menubar.html.ep"

Я что-то не так делаю?

1 Ответ

0 голосов
/ 23 мая 2018

Это работает, если поместить ваш контроллер в класс и сказать Mojolicious, где найти этот контроллер.По умолчанию приложение Lite не выполняет поиск контроллеров ни в каких пространствах имен маршрутов.

use Mojolicious::Lite;

push app->routes->namespaces->@*, 'Route::Controller';

(get '/x')->to('Route#bar');

app->start;


package Route::Controller::Route;

use Mojo::Base 'Mojolicious::Controller';

sub bar {
  my $self = shift;
  $self->render(json => { hello => 'simone' });
}

1;

При вызове типа perl test.pl get /x я вижу следующие выходные данные отладки:

[Wed May 23 12:01:14 2018] [debug] GET "/x"
[Wed May 23 12:01:14 2018] [debug] Routing to controller "Route::Controller::Route" and action "bar"
[Wed May 23 12:01:14 2018] [debug] 200 OK (0.000467s, 2141.328/s)
{"hello":"simone"}

Если выхорошо, если не использовать удобный синтаксис Route#bar, вы также можете указать маршрут как:

get '/x' => { controller => 'Route', action => 'bar' };

(присвоение хэш-значения get аналогично вызову ->to() на новом маршруте с этимиаргументы.)

...