2009-07-24 2 views
5

Il semble que par défaut, Catalyst ne génère pas les en-têtes Cache-Control:, etc. Je sais que je peux les sortir dans un mode de commande donné comme ceci:Comment puis-je définir l'en-tête Cache-Control pour chaque réponse dans Catalyst?

$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}"); 

Il obtiendrait assez douloureux faire que dans chaque méthode, bien que! Ce que je préfère est:

  • Un ensemble par défaut des en-têtes (expires maintenant, modifiée maintenant, cache-control: no-cache, Pragma: no-cache)
  • Une façon, par méthode , remplacez la valeur par défaut.

Existe-t-il un bon moyen d'accomplir ceci?

Répondre

6

derobert:

Excellente question. J'ai couvert exactement ceci dans un article pour le calendrier d'avent de Catalyst.

Fondamentalement, vous créez une variable de dissimulation qui définit votre temps de cache pour l'action donnée, puis vous le traitez dans votre routine racine. Voir l'article pour tous les détails.

JayK

+2

Vous pouvez inclure un petit extrait dans cette réponse. –

+0

Ce wiki ne se charge pas pour moi en ce moment (page blanche ou connexion réinitialisée), mais je peux travailler avec cette idée. Merci. Et je peux juste par défaut à non-cache si on n'est pas défini. Incroyable ce n'est pas intégré à Catalyst; semble que chaque application Catalyst doit avoir à faire cela! – derobert

+0

Ok, le wiki est de retour. C'est une très bonne approche. Cela devrait vraiment faire partie de Catalyst, ou au moins un plugin .... – derobert

3

Mise à jour: En fonction de votre réponse à ma suggestion précédente, j'ai décidé de mordre la balle et de regarder les documents Catalyst. Il me semble, l'endroit pour le faire est:

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 
} 

réponse précédente: Je ne l'utilise pas Catalyst, mais ne pouvait pas vous écrire juste un sous pour votre application?

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

Appelez avec set_default_response_headers($c->response->headers).

+0

Oui, je pourrais écrire un sous, mais je dois encore rappeler à l'appeler dans chaque méthode ... et si elle est oubliée dans une méthode du contrôleur, il conduit à un bogue probable. Semble être une approche plutôt fragile – derobert

Questions connexes