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 の使用法を削除し、代わりに「ベースを使用」を使用しようとしました。私はいつも同じエラーになってしまい、エラーメッセージを理解するのに本当に苦労しています。私のコードのどこにも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;

親はベースよりも好ましいと見なされることがありますが、ほとんど交換可能です。

更新、2012 年 7 月 26 日

FWIW、これは私のアプリの 1 つでモデルとして使用されている TheSchwartz の作業バージョンです。それは生産されています... 2年だと思います。猫バージョンは数年前ですが、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引数が適切に形成されていれば、何もする必要はまったくなく、TheSchwartz が期待するリストにフラット化することがわかります。

于 2012-07-13T17:27:39.430 に答える
1

これはまったくばかげており、機能することを期待せずに試してみたと言うだけのことの1つですが、どういうわけか、これで実際に修正されたようです.

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

モデルはまだ適切に機能しているように見えますが、そのようにエラーを起こしていたキーを恣意的に削除するだけで何かが壊れたと本当に思っています.

于 2012-07-22T18:21:00.163 に答える