【问题标题】:How do I cleanup at request end in Catalyst?如何在 Catalyst 的请求结束时进行清理?
【发布时间】:2010-10-01 11:54:51
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: perl catalyst


    【解决方案1】:

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

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

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

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

    编辑回复:

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

    你知道你在end中有$c,对吧?

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

    或者你可以通过MyApp::finalize 进行操作,正如我上面建议的那样。

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

    【讨论】:

    • 感谢您的回答。如果我无法让 Observer 插件工作,我会尝试按照您的建议将该钩子放入应用程序中。仅供参考,我是#catalyst 中的“derobert_work”或“derobert”。
    • 哦,至于我为什么要这样做,基本上,模型需要在请求结束时发出类似回滚的命令,以防万一发生故障。
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多