gpt4 book ai didi

perl - 处理 Perl Catalyst 中不明确的 Controller 操作

转载 作者:行者123 更新时间:2023-12-01 01:00:14 26 4
gpt4 key购买 nike

问题

我一直在学习 Catalyst 网络框架,我正在尝试了解 Catalyst 如何将 URL 分派(dispatch)给应用程序“操作”。

看来我可以用不明确的 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.');
}
}

这两个 Action 在不同的包中定义,但都与“/foo/...”路径相关联。查看上面的代码,并不清楚哪个操作优先。该决定似乎或多或少是由 Catalyst 在应用程序启动时随机做出的。有时是前者的 Action ,有时是后者的 Action 。

请注意,上面的代码是一个人为的示例,我可能不会故意创建两个映射到同一路径的不同操作。尽管如此,我不知道如何仅通过查看代码来预测最终会调用哪个操作。

问题

有没有办法指示 Catalyst 禁止这种歧义或至少提供警告?

最佳答案

我不确定是否有官方的 Catalyst 方法可以做到这一点,但您可以尝试以下方法,从 Catalyst question on how to list all actions in an app 中轻轻挖出

尝试在 __PACKAGE__->setup() 行之后的 App.pm 中添加如下内容:

# Start the application
__PACKAGE__->setup();

# Get all known actions and store the action name and source controller
my $controller_map = {};
my @controllers = map { __PACKAGE__->controller($_) } __PACKAGE__->controllers;
for my $controller ( @controllers ) {
my $controller_name = ref $controller;
my @actions = $controller->get_action_methods;
for my $action ( @actions ) {
my $name = $action->name;
next if $name =~ m|^_|; # _DISPATCH, _BEGIN, _AUTO, _ACTION, _END
next if $name eq 'auto';
next if $name eq 'begin';
next if $name eq 'index';
$controller_map->{ $name }->{ $controller_name }++;
}
}

# Show all action names that come from more than 1 controller
my $bad_action_names = 0;
for my $action ( sort keys %$controller_map ) {
my @original_controllers = keys %{ $controller_map->{ $action } };
if ( scalar @original_controllers > 1 ) {
$bad_action_names++;
print "Bad Action Names for '$action' : " . join(' ', @original_controllers) . "\n";
}
}

die "Unable to continue!!!" if $bad_action_names;

关于perl - 处理 Perl Catalyst 中不明确的 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com