すべてのクラスが共通の基本クラスと定義クラスを使用する 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 クラスの最後でハングし、ブラウザーでエスケープを押すまで進行しません。
更新:これは、触媒との相互作用に問題があるようです。単独で実行すると、このコードは正しく機能します。ただし、Catalyst アプリケーション内から実行すると失敗します。