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 /パスを自分で解析する必要があります。汚い感じ。 フックもここでは適切ではないようです。
コントローラーに自分の子部分をルーティングさせるにはどうすればよいですか?