可以在 Mojolicious::Lite 中使用 '->to()' 吗?

Can '->to()' be used in Mojolicious::Lite?

我想在 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 "Page not found... yet!" 并且 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"

我是不是弄错了什么?

如果将您的控制器放在 class 中并告诉 Mojolicious 在哪里可以找到该控制器,这确实有效。默认情况下,精简版应用程序不会在任何路由命名空间中搜索控制器。

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() 相同。)