J'ai un schéma DBIC, où toutes les classes utilisent une classe de base commune et une classe de définition. La classe de base charge les composants communs et remplace la méthode de mise à jour afin d'enregistrer les changesets dans une table d'audit. La classe de définition est une classe statique générée à partir de la base de données. Un en-tête de classe typique ressemble à quelque chose comme:Pourquoi DBIx :: Class avec héritage multiple échoue lors de la mise à jour?
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(@_);
}
Tout fonctionnait bien jusqu'à ce que j'ai ajouté et une dérogation à la mise à jour dans la classe utilisateur. Apparemment, avoir le remplacement dans la classe de base, et le conflit de classe d'utilisateur d'une certaine manière. J'utilise next :: method (@_) pour appeler la méthode de mise à jour suivante, mais elle se bloque toujours.
Ceci est une application CGI. Donc, quand je clique sur "sauvegarder", le navigateur tourne ses roues jusqu'à ce que j'atteigne l'échappement pour annuler la requête. À ce stade, mon enregistrement reprend et il montre que toutes les requêtes sont exécutées correctement, et rapidement, mais il se bloque à la fin de la classe User, et ne progresse pas jusqu'à ce que je clique sur échapper dans le navigateur.
MISE À JOUR: Cela semble être un problème avec l'interaction avec le catalyseur. Lorsqu'il est exécuté seul, ce code fonctionne correctement. Cependant, lorsqu'il est exécuté à partir d'une application de catalyseur, il échoue.
typo dans la ligne 'use base'? (missing a quote) – Ether
Édité pour corriger la faute de frappe –