2

我想要两种特殊的方法:

  • 适用于所有 URL 的一种
  • 仅针对特定路径 ( /admin )运行的路径

我认为最通用的是 using begin,而/admin的方法将使用auto. 例如,在这两个 Catalyst 控制器中:

package MyApp::Controller::Root;

sub begin :Private {
    my ($self, $c) = @_;

    $c->log->debug('Run for all URLs');
}

[...]

package MyApp::Controller::Admin;

sub auto :Private {
    my ($self, $c) = @_;

    $c->log->debug('Run for /admin only');
}

但这并没有达到我想要的。什么是正确的解决方案?

编辑:问题是Addmin::auto()永远不会被调用,而不是当我访问/admin/admin/

经过更多的测试,auto永远不会被调用。我试过把 auto 放在不同的地方,它从来没有被调用过。

4

3 回答 3

3

没有明显的理由说明您所描述的内容不能满足您的要求。那将是正确的方法。

日志应显示调度路径以及您的请求是否通过这些操作进行路由。如果没有,它会告诉你它是如何被处理的。

每个 sub 的第二行应以“;”结尾。我假设这是 SO 中的错字,而不是您的原始代码。

于 2009-10-28T05:20:21.207 回答
3

问题实际上如下:两个控制器都有这一行:

__PACKAGE__->config->{namespace} = '';

这阻止了自动功能在 Admin.pm 中触发

于 2009-11-02T03:34:26.983 回答
1

您在 Controller::Admin 中有开始操作吗?正如 RET 所说,您描述事物的方式应该可以正常工作;“全局开始”的唯一警告是,如果您在任何其他控制器中放置一个开始,它将“隐藏”全局控制器,因为每个动作只运行一个开始,它是“最具体”的一个(最长私有路径命名空间)。

于 2009-10-28T10:50:16.383 回答