2017-08-14 3 views
0

Mojolicious + Hypnotoad。コントローラへのリルートを代行する

メインのスクリプトのレベルですべてのルートを宣言する必要がないように、コントローラが要求の残りの部分を再ルーティングするようにします。

たとえば、 '/ foo/bar/baz'はController '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 } 

これは他の答えと一貫しているようです:

"ルータは最初のリクエストがseそれはしかし仕事をした場合であっても、動的に追加を経由して別の行動でそれを再入力する前に、実行は、コントローラFOOを終了します

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

「 後、rvedルータはルートを変更できません、経路。その後、

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

しかし、私は:

私はとにかく要求の残りの部分へのアクセス権を持っているので、それだけで、コントローラの「再ルータ」にディスパッチテーブルを作成されて行うことができ、他の方法Mojoliciousのディスパッチャの利点を失う - 私は残りのリクエストURL /パスを自分で解析する必要があります。汚い感じ。 フックもここでは適切ではないようです。

コントローラーに自分の子部分をルーティングさせるにはどうすればよいですか?

答えて

0

次のように私はこれを解決:それができるよう

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

our $routes = Mojolicious::Routes->new; 
my $r = $routes->under('/')->to('FOO#bar'); 

sub bar { ... } 

たぶんとしてエレガントではないが、それは私のために非常によく動作します:モジュールで次に

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); 

関連する問題