Почему DBIx::Class с множественным наследованием не работает при обновлении?

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

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. Поэтому, когда я нажимаю «сохранить», браузер крутится, пока я не нажму escape, чтобы отменить запрос. В этот момент мой журнал возвращается, и он показывает, что все запросы выполняются правильно и быстро, но он зависает в конце класса User и не выполняется, пока я не нажму escape в браузере.

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


person Jeffrey Fuller    schedule 21.09.2010    source источник
comment
опечатка в строке use base? (отсутствует цитата)   -  person Ether    schedule 21.09.2010


Ответы (1)


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

person Jeffrey Fuller    schedule 27.09.2010