2010-09-21 49 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類更新。顯然有基類中的覆蓋,和用戶類的衝突在某種程度上。我使用next :: method(@_)來調用下一個更新方法,但它總是掛起。

這是一個CGI應用程序。所以當我點擊「保存」瀏覽器旋轉輪子,直到我點擊逃生取消請求。在這一點上,我的日誌記錄選擇了備份,並且它顯示所有查詢都正確執行,並且很快,但是它在User類的最後掛起,並且直到我在瀏覽器中命中轉義纔會繼續。

更新:這似乎是與催化劑相互作用的問題。當自行運行時,此代碼可正常工作。但是,當從催化劑應用程序內執行時,它會失敗。

+0

「use base」行中的排字錯誤? (缺少一個報價) – Ether 2010-09-21 15:07:25

+0

編輯修復錯字 – 2010-09-21 15:20:58

回答

0

我在調試的應用程序中發現了這個問題的根本原因。原作者正在創建一個請求解析對象,該對象實例化一個CGI對象以解析傳入的請求。但是,這與催化劑衝突,因此請求對象旋轉其輪子直到來自客戶端的請求結束。顯然,他們需要得到的是url,以及來自用戶的ip,所以很容易插入代碼來使用環境變量而不調用CGI。

相關問題