【问题标题】:Delegate Rerouting to Controller将重路由委托给控制器
【发布时间】:2017-08-14 21:29:56
【问题描述】:

Mojolicious + 催眠蟾蜍。

我希望我的控制器重新路由请求的剩余部分,这样我就不必在主脚本级别声明所有路由。

因此,例如,'/foo/bar/baz' 应该路由到控制器 'FOO',然后它会决定自己内部的 'bar/baz' 的路由。

主脚本:

package MyApp;
use Mojo::Base 'Mojolicious';
use Mojolicious::Plugin::Config;

sub startup {
    my $self = shift;

    $self->moniker('MyApp');
    $self->plugin('Config');

    my $r = $self->routes;
    $r->any('/foo/*remainder')->to('FOO#rerouter')->name('TEST_NAME');
}

我尝试了一种方法,通过动态添加路由,但运行多次显示不一致 - 可能是由竞争条件或其他原因引起的:

package MyApp::Controller::FOO;
use Mojo::Base 'Mojolicious::Controller';

sub rerouter {
    my $self = shift;

    my $r = Mojolicious::Routes->new;
    $r->get('bar/:baz')->to('myInternalControllerAction'); 

    my $current_route = $self->current_route; # 'TEST_NAME'

    $self->app->routes->find($current_route)->add_child($r);
}

sub myInternalControllerAction { #stuff }

这似乎与其他答案一致:

"在第一个请求被处理之前,路由器是动态的,之后 也就是说,路由器不能改变路由”

https://stackoverflow.com/a/22291864/2304437

即使这确实有效,执行也会退出控制器 FOO,然后通过动态添加的路由重新进入不同的操作。

我可以做到的另一种方法是在控制器的“重新路由器”中创建一个调度表,因为无论如何我都可以访问请求的其余部分:

sub rerouter {
    my $self = shift;
    my $remainder = $self->stash->{remainder};
    # ...
}

但是我失去了 Mojolicious 调度程序的好处 - 我必须自己解析剩余的请求 URL/路径。感觉很脏。 钩子在这里似乎也不合适。

我怎样才能优雅地让控制器路由它自己的子部分?

【问题讨论】:

    标签: mojolicious


    【解决方案1】:

    我解决了这个问题:

    use MyApp::Controller::FOO; 
    my $r = $self->routes;
    my $r_root = $r->under('/' => sub { return 1; });
    
    my $baz = $r_root->under('/baz' => sub { return 1; });
    $baz->add_child($MyApp::Controller::FOO::routes);
    

    然后在模块中:

    package MyApp::Controller::FOO;
    use Mojo::Base 'Mojolicious::Controller';
    
    our $routes = Mojolicious::Routes->new;
    my $r = $routes->under('/')->to('FOO#bar');
    
    sub bar { ... }
    

    也许没有它应该的那么优雅,但它对我来说效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多