我有一个DBIC模式,其中所有类都使用公共基类和定义类。基类加载公共组件,并覆盖update方法以便在审计表中记录更改集。定义类是从数据库生成的静态类。典型的类标题类似于:
package Schema::Base;
use base 'DBIx::Class::Core';
sub update {
my $self = shift;
# track changes to row
my $instance = $self->next::method(@_);
# save changeset to audit table
return $instance;
}
package Schema::Immutable::User;
use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'DBIx::Class:Core';
__PACKAGE__->load_components("InflateColumn::DateTime");
package Schema::Mutable::User
use base ('Schema::Base', 'Schema::Immutable::User');
sub update {
my $self = shift;
# encrypt password
return $self->next::method(@_);
}
在我添加并覆盖User类中的更新之前,一切正常。显然在基类中有覆盖,并且User类以某种方式发生冲突。我正在使用next :: method(@_)来调用下一个更新方法,但它总是挂起。
这是一个CGI应用程序。所以,当我点击“保存”时,浏览器会旋转它的轮子,直到我点击逃脱取消请求。此时,我的日志记录会重新启动,它会显示正确执行所有查询,并且很快,但它会在User类的末尾挂起,并且在我在浏览器中点击escape之前不会继续执行。
更新:这似乎是与催化剂相互作用的问题。单独运行时,此代码可正常运行。但是,当从催化剂应用程序中执行时,它会失败。
答案 0 :(得分:0)
我在调试的应用程序中发现了此问题的根本原因。原作者正在创建一个请求解析对象,该对象实例化一个CGI对象来解析传入的请求。然而,这与催化剂冲突,因此请求对象旋转其轮子直到来自客户端的请求结束。显然他们需要得到的只是网址和来自用户的ip,所以很容易插入代码来使用环境变量而不需要调用CGI。