2

我正在尝试让我运行一个旧项目,但我遇到了我们为 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>
4

2 回答 2

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格式可能要归咎于您的 ref/HASH 处理。您可以从我mangle_arguments的文章中看到,如果 args 格式正确,则根本不需要对它们做任何事情,只需将它们展平到 TheSchwartz 期望的列表中。

于 2012-07-13T17:27:39.430 回答
1

这是彻头彻尾的愚蠢,你试图说你尝试过而不期望它工作的事情之一,但不知何故这实际上似乎已经解决了它。

delete $args->{class};
delete $args->{catalyst_component_name};
delete $args->{args};
return %{ $args }

该模型似乎仍然可以正常工作,尽管我真的希望通过随意删除像那样出错的键来破坏某些东西。

于 2012-07-22T18:21:00.163 回答