2013-02-11 4 views
5

begann ich einige Perl-Code abschreiben Catalyst, die wie folgt aussah:

package My::Controller; 
extends 'Catalyst::Controller'; 

sub handler :Path :Args(0) :Location(some/url) 
    my ($self, $c) = @_; 

    $self->do_something_with_arguments($c); 
    $self->make_a_decision($c); 
    $self->another_method($c); 
} 

Dann dachte ich. o O (? Warum Pass $ c um die ganze Zeit), und ich änderte dazu:

package My::Controller; 
extends 'Catalyst::Controller'; 

has c => (is => "rw", isa => "Catalyst"); 

sub handler :Path :Args(0) :Location(some/url) 
    my ($self, $c) = @_; 
    $self->c($c); 

    $self->do_something_with_arguments; 
    $self->make_a_decision; 
    $self->another_method; 
} 

Es gibt nur einen Einstieg in die Handler ist, so $ self-> c immer richtig eingestellt werden.

Meine Kollegen sagten, wenn Catalyst so verwendet werden sollte, dann würden alle es so benutzen. Sie befürchteten, dass dies zu einem Speicherverlust führen würde, da der Verweis auf $ c nach dem Ende der Anfrage bestehen bleiben würde. Ist das wahr?

Antwort

10

Dies ist kein "Speicherleck" in genau dem Sinne, an den die meisten Leute denken, da es nicht zu unbegrenztem Speicherwachstum führt, aber ja, Sie halten einen Anfragekontext länger als seine gewöhnliche Lebensdauer . Es wird freigegeben, wenn Sie das nächste Mal eine Anfrage stellen, die $self->c auf etwas anderes setzt, aber nicht früher. Vor allem aber ist es einfach falsches Design. Übergeben Sie den Kontext als Argument weiter. oder schalten Sie Ihre Controller-Methoden in private Aktionen und rufen Sie sie mit ->forward (die den Kontext automatisch übergibt); oder verschieben Sie Dinge in das Modell, wenn es angebracht ist, und haben Sie das Modell ACCEPT_CONTEXT.

Verwandte Themen