Mojo 将控制器和动作语法解析为 subref?
Mojo resolving controller and action syntax to subref?
给定一个类似
的语法
$c->routes->get($path)->to("$controller#$sub");
我想知道哪个 sub $controller#$sub
在调度时解析。有没有简单的方法来获取子的引用?您可以硬设置 ->namespaces()
所以我认为它并不总是像 $controller::$sub
那样简单,因为您可以 namespace::$controller::$sub
.
我无法使用 api 找到执行此操作的方法,但有一个私有方法 _class()
可以提供包含 sub 的控制器对象。这是一个例子:
./lib/MyApp/Controller/Foo.pm:
package MyApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
$self->render(text => 'Hello there.');
}
1;
./myapp.pl:
use strict;
use warnings;
use Mojolicious::Lite;
use lib './lib';
get '/' => sub {
my $c = shift;
$c->render(text => 'Hello World!');
};
my $namespaces = app->routes->namespaces;
push @$namespaces, 'MyApp::Controller';
app->routes->get('/welcome')->to('foo#welcome');
app->hook(
before_dispatch => sub {
my $c = shift;
my $field = { action => "welcome", controller => "foo" };
my $obj = $c->app->routes->_class( $c, $field );
my $method = $field->{action};
my $subref = sub { $obj->$method( @_ ) };
}
);
app->start;
给定一个类似
的语法$c->routes->get($path)->to("$controller#$sub");
我想知道哪个 sub $controller#$sub
在调度时解析。有没有简单的方法来获取子的引用?您可以硬设置 ->namespaces()
所以我认为它并不总是像 $controller::$sub
那样简单,因为您可以 namespace::$controller::$sub
.
我无法使用 api 找到执行此操作的方法,但有一个私有方法 _class()
可以提供包含 sub 的控制器对象。这是一个例子:
./lib/MyApp/Controller/Foo.pm:
package MyApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
$self->render(text => 'Hello there.');
}
1;
./myapp.pl:
use strict;
use warnings;
use Mojolicious::Lite;
use lib './lib';
get '/' => sub {
my $c = shift;
$c->render(text => 'Hello World!');
};
my $namespaces = app->routes->namespaces;
push @$namespaces, 'MyApp::Controller';
app->routes->get('/welcome')->to('foo#welcome');
app->hook(
before_dispatch => sub {
my $c = shift;
my $field = { action => "welcome", controller => "foo" };
my $obj = $c->app->routes->_class( $c, $field );
my $method = $field->{action};
my $subref = sub { $obj->$method( @_ ) };
}
);
app->start;