为什么具有多重继承的DBIx :: Class在更新时失败?

时间:2010-09-21 14:27:36

标签: perl cgi catalyst dbix-class

我有一个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之前不会继续执行。

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

1 个答案:

答案 0 :(得分:0)

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