【发布时间】:2016-07-28 22:06:09
【问题描述】:
有没有办法在不传递$c 的情况下访问它?我有一个通过CGI::Application 运行的第三方库,我用Catalyst::Controller::WrapCGI 引导它。将$c 放入被调用的代码以便我准备将其迁移到 Catalyst 的最佳方法是什么?
如果无法访问,我如何在应用程序上下文中访问$c?
【问题讨论】:
有没有办法在不传递$c 的情况下访问它?我有一个通过CGI::Application 运行的第三方库,我用Catalyst::Controller::WrapCGI 引导它。将$c 放入被调用的代码以便我准备将其迁移到 Catalyst 的最佳方法是什么?
如果无法访问,我如何在应用程序上下文中访问$c?
【问题讨论】:
至少据我所知,this blog entry in the Catalyst Advent Calendar 让您了解如何完成它。他们只是创建一个全局和一个访问器,如果它有效.. 它有效吗?
our $__ACTIVE_CTX;
sub ctx { $__ACTIVE_CTX }
around 'dispatch' => sub {
my ($orig, $c, @args) = @_;
local $__ACTIVE_CTX = $c;
$c->$orig(@args)
};
但是,在你自己动手之前,请查看这个模块CatalystX::GlobalContext,它正好解决了这个问题。抄自概要:
package MyApp::Controller::Root;
use CatalystX::GlobalContext ();
sub auto : Private {
my ($self, $c) = @_;
CatalystX::GlobalContext->set_context($c);
1;
}
package Some::Other::Module;
use CatalystX::GlobalContext '$c';
...
do stuff with $c
...
【讨论】: