为什么我使用perl模块Catalyst :: Model :: Adapter会出现此错误?

时间:2012-07-12 23:23:22

标签: perl catalyst

我试图获得一个旧项目,我被交给我,并且我遇到了我们为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>

2 个答案:

答案 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;

parent有时被认为优于base,但它们几乎可以互换。

2012年7月26日更新

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 }

该模型似乎仍然正常工作,但我真的希望通过随意删除那些错误的密钥来破坏某些东西。