我正在尝试让我运行一个旧项目,但我遇到了一个问题,我们为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的用法,改为使用"use base“。我总是以同样的错误结束,我真的很难理解错误消息。我没有在我的代码中看到catalyst_component_name的任何定义,所以它必须从Catalyst::Model::Adaptor传递下来,但是..为什么它不起作用?
编辑:
下面是相关的配置部分:
<Model::TheSchwartz>
<args>
verbose 1
<databases>
dsn dbi:mysql:host=db.vpn;dbname=theschwartz
user user
pass password
</databases>
</args>
</Model::TheSchwartz>发布于 2012-07-23 02:21:00
这是非常愚蠢的,其中一件事你只是想说你没有期待它的工作,但不知何故,这似乎实际上已经解决了它。
delete $args->{class};
delete $args->{catalyst_component_name};
delete $args->{args};
return %{ $args }该模型似乎仍然正常工作,尽管我真的希望通过任意删除像这样出错的键来打破某些东西。
发布于 2012-07-14 01:27:39
您正在尝试创建一个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;parent有时被认为比base更可取,但它们几乎可以互换。
更新,2012年7月26日
仅供参考,这是我的一个应用程序中作为模型使用的TheSchwartz的工作版本;它已经在生产中使用了……我想是两年了。猫的版本是几年前,但不是两年前。很抱歉我之前没把它挖出来-
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格式可能是你的引用/散列处理的原因。您可以从我的mangle_arguments中看到,如果args格式正确,除了将它们展平到TheSchwartz期望的列表之外,根本不需要对它们做任何操作。
https://stackoverflow.com/questions/11462152
复制相似问题