2

我有一个 DBIC 模式,其中所有类都使用一个公共基类和定义类。基类加载公共组件,并覆盖更新方法以便在审计表中记录变更集。定义类是从数据库生成的静态类。一个典型的类头看起来像:

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 类的末尾挂起,直到我在浏览器中点击转义后才会继续。

更新:这似乎是与催化剂相互作用的问题。自行运行时,此代码可以正常工作。但是,当从催化剂应用程序中执行时,它会失败。

4

1 回答 1

0

我在我正在调试的应用程序中发现了这个问题的根本原因。原作者正在创建一个请求解析对象,该对象实例化一个 CGI 对象来解析传入的请求。但是,这与催化剂冲突,因此请求对象旋转它的轮子,直到来自客户端的请求结束。显然,他们只需要获取 url 和来自用户的 ip,因此使用环境变量插入代码很容易,无需调用 CGI。

于 2010-09-27T13:01:28.457 回答