首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在perl模块Catalyst::Model::Adaptor中得到这个错误?

为什么我在perl模块Catalyst::Model::Adaptor中得到这个错误?
EN

Stack Overflow用户
提问于 2012-07-13 07:23:22
回答 2查看 769关注 0票数 2

我正在尝试让我运行一个旧项目,但我遇到了一个问题,我们为TheSchwartz提供的模型。代码看起来与我在网上找到的一堆做类似事情的其他示例完全相同。代码也非常简单;

代码语言:javascript
复制
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;

我得到的错误是

代码语言:javascript
复制
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传递下来,但是..为什么它不起作用?

编辑:

下面是相关的配置部分:

代码语言:javascript
复制
<Model::TheSchwartz>
    <args>
        verbose 1
        <databases>
            dsn     dbi:mysql:host=db.vpn;dbname=theschwartz
            user    user
            pass    password
        </databases>
    </args>
</Model::TheSchwartz>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-23 02:21:00

这是非常愚蠢的,其中一件事你只是想说你没有期待它的工作,但不知何故,这似乎实际上已经解决了它。

代码语言:javascript
复制
delete $args->{class};
delete $args->{catalyst_component_name};
delete $args->{args};
return %{ $args }

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-14 01:27:39

您正在尝试创建一个Moose类,但它与常规的Catalyst::Model::Adaptor用法不兼容;而且,在您的示例中,您也没有使用任何Moose功能。这可能是您真正想要的,经过简单的测试。

代码语言:javascript
复制
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的工作版本;它已经在生产中使用了……我想是两年了。猫的版本是几年前,但不是两年前。很抱歉我之前没把它挖出来-

代码语言:javascript
复制
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期望的列表之外,根本不需要对它们做任何操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11462152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档