gpt4 book ai didi

perl - Catalyst中DBIx::Class::Schema模型上的Moose方法修饰符

转载 作者:行者123 更新时间:2023-12-04 04:39:27 24 4
gpt4 key购买 nike

对于任何给定的结果类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之前,不会通过BUILDARGS运行new参数。
$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails

有趣的是,如果我用'new'=> sub {}代替而不是'BUILDARGS'=> sub {},则两种情况下的行为都是相同的,并且效果很好,但据我所知,Moose教义指出永远不要搞乱新的。

有人愿意帮助我了解为什么会这样,或者是否有更好的方法吗?

最佳答案

我知道,您正在使用MooseX::NonMoose。

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

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

“MooseX::NonMoose允许您通过定义FOREIGNBUILDARGS方法来处理传递给父类(super class)构造函数的参数列表。”
http://metacpan.org/pod/MooseX::NonMoose

我真的希望这对您有用!

关于perl - Catalyst中DBIx::Class::Schema模型上的Moose方法修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4377685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com