可以在 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()
相同。)
我想在 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()
相同。)