2

我试图在使用 Catalyst 完成每个请求后调用一些代码。基本上,我想运行一些代码作为finalize. 据说Catalyst::Plugin::Observe会这样做,但它似乎完全坏了(只是加载插件会破坏 Catalyst)。

我正在尝试修复 Observe 插件,但事实证明这很顽固。

那么,有没有更好的方法来在每个请求结束时调用一些清理代码?

(注意:这是在模型中,而不是控制器中,所以我不能只使用sub end { ... }

4

1 回答 1

7

实际上,您可以直接将代码添加到“MyApp”类中:

package MyApp;
use Catalyst ...;

...

sub finalize {
    my $c = shift;
    $c->NEXT::finalize(@_);
    # do your thing
}

这就是所有插件的工作方式;它们只是成为您应用程序一部分的方法。

我确实同意让“finalize”生成一个要观察的事件更清晰......但这是我们现在必须使用的 :) 加入 irc.perl.org 上的#catalyst,我们可以进一步讨论。(我是 jrockway,你可能猜到了。)

编辑回复:

(注意:这是在模型中,而不是控制器中,所以我不能只使用 sub end { ... })

你知道你有$cend对吧?

package Your::Model;

sub cleanup {
   my $self = shift;
   ...
}

package Your::Controller;

sub end :Private {
    my ($self, $c) = @_;
    $c->model('Your::Model')->cleanup( ... )
}

或者你可以从 开始MyApp::finalize,正如我上面建议的那样。

真正的问题是,为什么你的模型需要知道请求周期?这听起来像非常紧密的耦合。

于 2009-01-15T02:20:34.623 回答