【发布时间】:2016-09-03 15:40:37
【问题描述】:
问题
我一直在学习 Catalyst Web 框架,并试图了解 Catalyst 如何将 URL 分派给应用程序“操作”。
看来我可以用模糊的 URL 调度规则编写我的应用程序:
package Myapp::Controller::Root {
__PACKAGE__->config(namespace => '');
....
sub foo :Local {
my ( $self, $c ) = @_;
$c->response->body('foo action in Root controller.');
}
}
package Myapp::Controller::Foo {
....
sub default :Path {
my ( $self, $c ) = @_;
$c->response->body('default action in Foo controller.');
}
}
这两个动作在不同的包中定义,但都与“/foo/...”路径相关联。查看上面的代码,尚不清楚哪个操作将优先。启动应用程序时,Catalyst 似乎或多或少地随机做出该决定。有时是前者,有时是后者。
请注意,上面的代码是一个人为的示例,我可能不会故意创建两个映射到同一路径的不同操作。尽管如此,我不知道如何仅通过查看代码来预测最终会调用哪个操作。
问题
有没有办法指示 Catalyst 禁止这种歧义或至少提供警告?
【问题讨论】:
-
metacpan.org/pod/distribution/Catalyst-Runtime/lib/Catalyst/… 谈到了路由匹配,并表示如果同一控制器内有多个动作匹配同一路径,则代码中最后(最低)定义的动作将获胜。然而,它没有谈论几个控制器。按理说同样有效,但加载组件的顺序可能是随机的,因此您会看到波动。
-
我建议在 irc.perl.org 上的 #catalyst 中提出这个问题。由于 Catalyst 的作者没有积极参与这里,它可能会在那里得到更好的答案。