在Catalyst中,将Moose方法修饰符应用于DBIx::Class::Schema模型

9

对于任何给定的结果类MySchema :: Result :: Foo(从使用Moose / MooseX :: nonmoose生成的默认模式加载程序生成的语法构建)

如果我添加一个BUILDARGS方法包装器来清理行的构造函数数据,如下所示:

package MySchema::Result::Foo;
use Moose;
use MooseX::NonMoose;
[etc ..]

around 'BUILDARGS' => sub {
   my $orig = shift;
   my $class = shift;
   delete $_[0]->{not_a_real_column};
   return $class->$orig(@_);
};

当直接使用架构时,它能够正常工作。例如,以下内容可以正常工作:在调用“new”之前,使用“real_column =>'value'”创建一个新的行对象,并在“not_a_real_column”被移除。
use MySchema;
my $s = MySchema->connect('dbi:blahblahblah');
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win

然而,当通过Catalyst::Model::DBIC::Schema使用相同的模式时,顺序是不同的。尝试创建新的Foo行对象时,以下内容将失败,因为not_a_real_column无效。换句话说,在调用 ->new之前,new的参数没有经过BUILDARGS处理。
$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails

有趣的是,如果我将 'new' => sub{} 包裹起来而不是将 'BUILDARGS' => sub{} 包裹起来,则两种情况下的行为都相同,并且可以正常工作,但据我所知,Moose dogma规定永远不要改变new。是否有人能帮助我理解为什么会这样,或者是否有更好的方法?
1个回答

1

我看到你正在使用MooseX::NonMoose。

鉴于此,我猜测你需要使用FOREIGNBUILDARGS。

around 'FOREGINBUILDARGS' => sub {
   my $orig = shift;
   my $class = shift;
   delete $_[0]->{not_a_real_column};
   return $class->$orig(@_);
};

"MooseX::NonMoose允许您通过定义FOREIGNBUILDARGS方法来操作传递给超类构造函数的参数列表。"
http://metacpan.org/pod/MooseX::NonMoose

我真心希望这对您有帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接