2009-07-24 24 views
5

Varsayılan olarak Katalizörün Cache-Control: vb. Başlıklarını vermediği anlaşılıyor. Böyle bir verilen denetleyici yönteminde onları çıktılı can biliyorum:Catalyst'teki her yanıt için Önbellek Denetimi üstbilgisini nasıl ayarlayabilirim?

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

O her yöntemde olsa yapıyor oldukça ağrılı olur! Ne tercih ediyorum geçerli:

  • başlıklarının varsayılan kümesi (şimdi sona eriyor, son anda, önbellek kontrolü modifiye: no-cache, pragma: no-cache)
  • bir yolu, başına yöntemle varsayılanı geçersiz kıl.

Bunu başarmanın iyi bir yolu var mı?

cevap

6

derobert:

Mükemmel bir soru. Ben Catalyst advent takvimi için tam olarak bu bir article kapsamında.

Temel olarak, belirli eylem için önbellek sürenizi tanımlayan bir veri kümesi oluşturur ve bunu Kök son yordamınızda işlersiniz. Tüm ayrıntılar için makaleye bakın.

JayK

+2

Bu cevaba kısa bir snippet eklemek isteyebilirsiniz. –

+0

Bu wiki şu anda benim için yüklenmiyor (boş sayfa veya bağlantı sıfırlama), ancak bu fikirle çalışabilirim. Teşekkürler. Ve eğer ayarlanmamışsa önbelleğe almayı önleyebilirim. İnanılmaz bu Catalyst için yerleşik değildir; her Catalyst uygulaması bunu yapmak zorunda gibi görünüyor! – derobert

+0

Tamam, wiki geri döndü. Bu gerçekten güzel bir yaklaşım. Bu gerçekten Catalyst'in ya da en azından bir eklentinin parçası olmalıydı… – derobert

3

Güncelleme: Daha önceki öneriye verdiğiniz yanıt üzerine, mermiyi ısırmaya karar verdim ve Catalyst belgelerine bakmaya karar verdim. Ben Catalyst kullanmayın, ama sadece uygulamanız için bir alt yazamadı:

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 
} 

Daha önce yanıt: Bana öyle geliyor, bunu yapmak için yer var?

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

set_default_response_headers($c->response->headers) numaralı telefonu arayın.

+0

Evet, bir alt yazabilirim, ama sonra hala her yöntemde aramak hatırlamak zorunda ... ve herhangi bir denetleyici yönteminde unutulmuş alırsa, bu muhtemel bir hata neden olur. Kısmen kırılgan bir yaklaşım gibi görünüyor – derobert

İlgili konular