2009-07-24 3 views
5

Es scheint, dass Catalyst standardmäßig keine Cache-Control: Header usw. ausgibt. Ich weiß, ich gibt sie in einer bestimmten Controller-Methode wie diese kann:Wie kann ich den Cache-Control-Header für jede Antwort in Catalyst setzen?

$c->response->headers->last_modified(time); 
$c->response->headers->expires(time + $self->{cache_time}); 
$c->response->headers->header(cache_control => "public, max-age=$self->{cache_time}"); 

Es wäre ziemlich schmerzhaft erhalten tun, dass in jeder Methode, aber! Was ich würde es vorziehen, ist:

  • Ein Standardsatz von Headern (gültig bis jetzt, zuletzt nun geändert, Cache-Control: no-cache, Pragma: no-cache)
  • Ein Weg, um pro-Verfahren Überschreiben Sie den Standardwert.

Gibt es einen guten Weg, dies zu erreichen?

Antwort

6

Derobert:

Ausgezeichnete Frage. Genau das habe ich in einem article für den Catalyst Adventskalender abgedeckt.

Im Grunde erstellen Sie eine Stash-Variable, die Ihre Cache-Zeit für die angegebene Aktion definiert und dann in Ihrer Root-End-Routine verarbeitet. Siehe den Artikel für alle Details.

JayK

+2

Sie möchten vielleicht ein kurzes Snippet in diese Antwort aufnehmen. –

+0

Dieses Wiki wird im Moment nicht geladen (leere Seite oder Verbindung zurückgesetzt), aber ich kann mit dieser Idee arbeiten. Vielen Dank. Und ich kann es einfach auf keinen Cache setzen, wenn einer nicht gesetzt ist. Erstaunlicherweise ist das nicht in Catalyst integriert; scheint, als müsste jede Catalyst-App dies tun! – derobert

+0

Ok, das Wiki ist wieder da. Das ist ein wirklich netter Ansatz. Das sollte wirklich ein Teil von Catalyst sein, oder wenigstens ein Plugin .... – derobert

3

Update: Basierend auf Ihrer Antwort auf meinen früheren Vorschlag, beschloss ich, in den sauren Apfel beißen und schauen Sie sich die Catalyst-Dokumente. Es scheint mir, der Ort, dies zu tun, ist in:

sub end : Private { 
    my ($self, $c) = @_; 

    # handle errors etc. 

    if ($c->res->body) { 
     if ("some condition") { 
      set_default_response_headers($c->response->headers); 
      return; 
     } 
     else { 
      do_something_else(); 
      return; 
     } 
    } 
    $c->forward('MyApp::View::TT'); # render template 
} 

Frühere Antwort: Ich benutze Katalysator nicht, konnte aber nicht, dass Sie nur eine Unter für Ihre Anwendung schreiben?

sub set_default_response_headers { 
    my ($h) = @_; 
    $h->last_modified(time); 
    $h->expires(time + $self->{cache_time}); 
    $h->header(cache_control => "public, max-age=$self->{cache_time}"); 
    return $h;  
} 

Anruf mit set_default_response_headers($c->response->headers).

+0

Ja, ich konnte eine Unter schreiben, aber dann erinnere mich noch es in jeder Methode zu nennen ... und wenn es in jeder Controller-Methode vergessen wird, führt es zu einem wahrscheinlichen Fehler. Scheint wie ein ziemlich zerbrechlicher Ansatz – derobert