2009-01-14 4 views
2

J'essaye d'obtenir du code appelé après que chaque requête se termine en utilisant Catalyst. Fondamentalement, je veux exécuter du code dans le cadre de finalize. Supposément Catalyst::Plugin::Observe le fera, mais il semble complètement brisé (il suffit de charger le plugin rompt Catalyst).Comment puis-je nettoyer à la fin de la requête dans Catalyst?

J'essaye de réparer le plugin Observe, mais cela s'avère têtu. Donc, y a-t-il une meilleure façon d'obtenir un code de nettoyage appelé à la fin de chaque requête?

(Note: Ceci est dans un modèle, pas un contrôleur, donc je ne peux pas simplement utiliser sub end { ... })

Répondre

7

Vous pouvez en fait juste ajouter le code directement à votre classe « MyApp »:

package MyApp; 
use Catalyst ...; 

... 

sub finalize { 
    my $c = shift; 
    $c->NEXT::finalize(@_); 
    # do your thing 
} 

Voici comment fonctionnent tous les plugins; ce ne sont que des méthodes qui font partie de votre application.

Je suis d'accord que faire "finalize" générer un événement à observer est plus propre ... mais c'est ce que nous devons travailler pour le moment :) Rejoignez #catalyst sur irc.perl.org, et nous pourrons en discuter . (Je suis jrockway, comme vous pouvez le deviner.)

Edité pour répondre à:

(Note: Ceci est dans un modèle, pas un contrôleur, donc je ne peux pas simplement utiliser sous {fin. ..})

vous ne savez que vous avez $c à end, non?

package Your::Model; 

sub cleanup { 
    my $self = shift; 
    ... 
} 

package Your::Controller; 

sub end :Private { 
    my ($self, $c) = @_; 
    $c->model('Your::Model')->cleanup(...) 
} 

Ou vous pouvez le faire à partir MyApp::finalize, comme je l'ai suggéré plus haut. La vraie question est la suivante: pourquoi votre modèle a-t-il besoin de connaître le cycle de la demande? Cela ressemble à un couplage terriblement serré.

+0

Merci pour la réponse. Si je n'arrive pas à faire fonctionner le plugin Observer, je vais essayer de mettre ce hook dans l'application comme vous le suggérez. Pour info, je suis 'derobert_work' ou 'derobert' dans #catalyst. – derobert

+0

Oh, et pour ce qui est de savoir pourquoi je fais cela, en gros, le modèle doit envoyer une commande de type rollback à la fin de la requête, juste au cas où quelque chose se casse. – derobert

Questions connexes