2010-09-21 30 views
2

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.

+0

typo dans la ligne 'use base'? (missing a quote) – Ether

+0

Édité pour corriger la faute de frappe –

Répondre

0

J'ai découvert la cause première de ce problème dans l'application que j'étais en train de déboguer. L'auteur original créait un objet d'analyse de requête qui instancie un objet CGI pour analyser la requête entrante. Cependant, ceci est en conflit avec le catalyseur, donc l'objet de requête tourne ses roues jusqu'à ce que la demande du client se termine. Apparemment, tout ce dont ils avaient besoin était l'url, et l'adresse IP de l'utilisateur, il était donc assez facile d'insérer du code pour le faire en utilisant les variables d'environnement sans appeler CGI.