Perl 为什么可以';t我访问一个catalyst模型';从模型本身内部进行配置?

Perl 为什么可以';t我访问一个catalyst模型';从模型本身内部进行配置?,perl,catalyst,Perl,Catalyst,我有一个类似这样的类: package MyApp::Model::Skunk::Find::Images; use Moose; use namespace::autoclean; extends 'Catalyst::Model::Factory'; use Data::Dump qw/dump/; sub prepare_arguments { my ($self, $c) = @_; # these are for debugging purposes only

我有一个类似这样的类:

package MyApp::Model::Skunk::Find::Images;

use Moose;
use namespace::autoclean;

extends 'Catalyst::Model::Factory';

use Data::Dump qw/dump/;

sub prepare_arguments {
    my ($self, $c) = @_;

    # these are for debugging purposes only

    $c->log->info("package: " . __PACKAGE__);
    $c->log->info("catalyst config: " . dump $c->config);
    $c->log->info("images class: " . __PACKAGE__->config->{class});
    $c->log->info("images root: " .  __PACKAGE__->config->{root});

    return { root => __PACKAGE__->config->{root} };
}
__PACKAGE__->config( 
                    class => 'MyApp::Find',
                    root  => '/foo/bar/myapp/data/img'
                   );
myapp.conf如下所示(代码片段):

在MyApp::Skunk::Find::图像中,这两个图像都不会产生任何结果

如果我从包内这样配置变量:

package MyApp::Model::Skunk::Find::Images;

use Moose;
use namespace::autoclean;

extends 'Catalyst::Model::Factory';

use Data::Dump qw/dump/;

sub prepare_arguments {
    my ($self, $c) = @_;

    # these are for debugging purposes only

    $c->log->info("package: " . __PACKAGE__);
    $c->log->info("catalyst config: " . dump $c->config);
    $c->log->info("images class: " . __PACKAGE__->config->{class});
    $c->log->info("images root: " .  __PACKAGE__->config->{root});

    return { root => __PACKAGE__->config->{root} };
}
__PACKAGE__->config( 
                    class => 'MyApp::Find',
                    root  => '/foo/bar/myapp/data/img'
                   );
一切正常


有人能解释一下吗?

Catalyst组件的配置被传递给其构造函数。您只需在模型中执行以下操作:

has ['class','root'] => (
   isa => 'Str',
   is => 'ro',
);

在方法中使用
$self->class
$self->root
。在组件中访问
\uuuuuuuu包\uuuuuu->config
是一个错误(启动期间设置config的一次除外)。查看
$c->config
更为离题。

催化剂组件的配置将传递给其构造函数。您只需在模型中执行以下操作:

has ['class','root'] => (
   isa => 'Str',
   is => 'ro',
);

在方法中使用
$self->class
$self->root
。在组件中访问
\uuuuuuuu包\uuuuuu->config
是一个错误(启动期间设置config的一次除外)。查看
$c->config
甚至更加离题。

非常好,答案正确。我还想补充一点,如果模型需要访问Catalyst对象,那么设计是错误的。谢谢,我会尝试一下。我的目标是能够在启动时从myapp.conf设置一些参数,就像可以在那里设置dbi连接一样-请参阅文档中Catalyst::Model::DBIC::SchemaExcellent的示例,这是正确的答案。我还想补充一点,如果模型需要访问Catalyst对象,那么设计是错误的。谢谢,我会尝试一下。我的目标是能够在启动时从myapp.conf设置一些参数,就像可以在那里设置dbi连接一样-参见文档中Catalyst::Model::DBIC::Schema的示例