我试图获得一个旧项目,我被交给我,并且我遇到了我们为TheSchwartz所拥有的模型的问题。代码看起来与其他一些例子完全一样,可以做我在网上找到的类似的事情。代码也很简单;
package MyApp::Model::TheSchwartz;
use Moose;
use namespace::autoclean;
extends 'Catalyst::Model::Adaptor';
__PACKAGE__->config( class => "TheSchwartz" );
sub mangle_arguments
{
my ($self, $args) = @_;
if($args->{databases})
{
if(ref($args->{databases}) eq 'HASH')
{
my %db = %{ $args->{databases} };
$args->{databases} = [ \%db ];
}
}
return %{ $args }
}
1;
我得到的错误是
Couldn't instantiate component "MyApp::Model::TheSchwartz", "unknown options args, catalyst_component_name, class at /usr/local/share/perl/5.14.2/Catalyst/Model/Adaptor/Base.pm line 27."Compilation failed in require at /usr/local/share/perl/5.14.2/Module/Runtime.pm line 317.
at /usr/local/share/perl/5.14.2/Catalyst/Script/Server.pm line 242.
我已尝试删除mangle_arguments功能,我已尝试删除Moose的使用情况并使用"使用base"代替。我总是遇到同样的错误,而且我甚至很难解决错误信息。我没有看到在我的代码中的任何地方定义的catalyst_component_name,所以它必须从Catalyst :: Model :: Adapter传递下去,但是..为什么它不起作用?
编辑:
这里是相关的配置部分:
<Model::TheSchwartz>
<args>
verbose 1
<databases>
dsn dbi:mysql:host=db.vpn;dbname=theschwartz
user user
pass password
</databases>
</args>
</Model::TheSchwartz>
答案 0 :(得分:1)
您正在尝试创建一个Moose类,但它与该类不兼容 定期Catalyst::Model::Adaptor用法;而你却不是 例如,无论如何都要使用任何Moose功能。这可能是, 经过轻微测试,你真正想要的是什么。
package MyApp::Model::TheSchwartz;
use parent "Catalyst::Model::Adaptor";
__PACKAGE__->config( class => "TheSchwartz" );
sub mangle_arguments {
my ($self, $args) = @_;
if ( $args->{databases} )
{
if (ref ( $args->{databases} ) eq "HASH" )
{
my %db = %{ $args->{databases} };
$args->{databases} = [ \%db ];
}
}
return %{ $args }
}
1;
FWIW,这是TheSchwartz的一个工作版本,在我的一个应用程序中用作模型;我认为它已经生产了2年。 Cat版本有几个但不是2年。对不起,我之前没有把它挖出来 -
package MyApp::Model::TheSchwartz;
use parent "Catalyst::Model::Adaptor";
__PACKAGE__->config( class => "TheSchwartz" );
sub mangle_arguments { %{$_[1]} }
1;
__END__
# In MyApp.pm
"Model::TheSchwartz" => {
args => {
verbose => 1,
databases => [{
dsn => "dbi:mysql:MyAppDB;host=my_host",
user => "something",
pass => "somethingsecret",
}],
}
},
您正在使用的Config::General格式可能会归咎于您的参考/ HASH处理。你可以从我的mangle_arguments
看到,如果args正确形成,根本不需要对它们做任何事情,而是将它们压平到TheSchwartz预期的列表中。
答案 1 :(得分:0)
这是完全愚蠢的,其中一件事你只是想说你尝试过它而不期望它能起作用,但不知怎的,这似乎已经解决了。
delete $args->{class};
delete $args->{catalyst_component_name};
delete $args->{args};
return %{ $args }
该模型似乎仍然正常工作,但我真的希望通过随意删除那些错误的密钥来破坏某些东西。