2013-03-26 1 views
1

J'ai une classe qui ressemble à ceci:Pourquoi ne puis-je pas accéder à la configuration d'un modèle de catalyseur depuis l'intérieur du modèle?

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} }; 
} 

et myapp.conf ressemble à ceci (extrait):

<Model::Skunk::Find::Images> 
    root '/foo/bar/myapp/data/img' 
    class MyApp::Find 
</Model::Skunk::Find::Images> 

Je peux accéder à tout le hachage de configuration de l'application (je suis au courant de this réponse), mais je ne peux pas sembler être en mesure d'accéder à la classe config directement, donc

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

de l'intérieur MyApp :: Skunk :: Trouver :: Images les deux ne produisent rien.

Si je configure les variables à l'intérieur du paquet comme celui-ci:

__PACKAGE__->config( 
        class => 'MyApp::Find', 
        root => '/foo/bar/myapp/data/img' 
        ); 

tout fonctionne bien.

Quelqu'un peut-il vous aider à expliquer?

Répondre

1

La configuration d'un composant Catalyst est transmise à son constructeur. Vous devez juste faire dans votre modèle:

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

et dans vos méthodes et utiliser $self->class$self->root. Accès __PACKAGE__->config dans un composant (sauf une fois, lors du démarrage, à définir config) est une erreur. En regardant $c->config est encore plus loin de la marque.

+0

Excellent, la bonne réponse. J'ajouterais aussi que si un modèle a besoin d'accéder à l'objet Catalyst, alors le design est incorrect. – Horus

+0

Merci, je vais essayer ça. Mon but est de pouvoir paramétrer myapp.conf au démarrage, de la même manière que l'on peut y établir la connexion dbi - voir l'exemple dans les docs pour Catalyst :: Model :: DBIC :: Schema – simone

+0

@simone right, this est la bonne façon de le faire. – hobbs

Questions connexes