2010-09-21 1 views
2

У меня есть схема DBIC, где все классы используют общий базовый класс и класс определения. Базовый класс загружает общие компоненты и переопределяет метод обновления для записи наборов изменений в таблице аудита. Класс определения - это статический класс, созданный из базы данных. Заголовок типичного класса выглядит примерно так:Почему DBIx :: Class с множественным наследованием терпят неудачу при обновлении?

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. Очевидно, что переопределение в базовом классе и конфликт класса пользователя каким-то образом. Я использую следующий :: метод (@_), чтобы вызвать следующий метод обновления, но он всегда зависает.

Это приложение CGI. Поэтому, когда я нажимаю «save», браузер вращает свои колеса, пока я не удалю бежать, чтобы отменить запрос. На этом этапе мой журнал выбирает резервную копию, и он показывает, что все запросы выполняются правильно и быстро, но он зависает в конце класса User и не прогрессирует, пока я не удаляю escape-код в браузере.

ОБНОВЛЕНИЕ: Это, по-видимому, проблема взаимодействия с катализатором. При запуске сам по себе этот код работает правильно. Однако, когда он выполняется из приложения катализатора, он терпит неудачу.

+0

опечатка в строке 'use base'? (отсутствует цитата) – Ether

+0

Отредактировано для исправления опечатки –

ответ

0

Я обнаружил причину этой проблемы в приложении, которое я отлаживал. Оригинальный автор создавал объект синтаксического запроса, который создает экземпляр объекта CGI для анализа входящего запроса. Однако это конфликтует с катализатором, поэтому объект запроса вращает свои колеса до тех пор, пока запрос от клиента не закончится. Очевидно, все, что им нужно было получить, это url, и ip от пользователя, поэтому было достаточно легко вставить код для этого, используя переменные окружения без вызова CGI.