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;