2009-07-24 28 views
5

Dường như theo mặc định, Catalyst không xuất ra các tiêu đề Cache-Control:, v.v. Tôi biết tôi có thể xuất chúng theo một phương pháp điều khiển đã cho như sau:Làm cách nào để đặt tiêu đề Bộ nhớ cache-Kiểm soát cho mọi phản hồi trong 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}"); 

Nó sẽ trở nên khá đau đớn khi làm điều đó trong mỗi phương pháp! Những gì tôi muốn là:

  • Một tập hợp mặc định của tiêu đề (hết hạn bây giờ, biến đổi cuối cùng bây giờ, bộ nhớ cache-control: no-cache, pragma: no-cache)
  • Một cách để, mỗi phương pháp , ghi đè lên mặc định.

Có cách nào tốt để thực hiện việc này không?

Trả lời

6

derobert:

Câu hỏi hay. Tôi đã trình bày chính xác điều này trong một số article cho lịch khám phá Catalyst.

Về cơ bản, bạn tạo biến stash xác định thời gian bộ nhớ cache của bạn cho hành động đã cho và sau đó bạn xử lý nó trong thói quen Gốc của bạn. Xem bài viết cho tất cả các chi tiết.

JayK

+2

Bạn có thể muốn bao gồm một đoạn trích ngắn trong câu trả lời này. –

+0

Hiện tại wiki không tải cho tôi (trang trống hoặc thiết lập lại kết nối), nhưng tôi có thể làm việc với ý tưởng đó. Cảm ơn. Và tôi chỉ có thể mặc định nó để không có bộ nhớ cache nếu không được thiết lập. Điều tuyệt vời này không được tích hợp trong Catalyst; có vẻ như mọi ứng dụng Catalyst đều phải làm điều này! – derobert

+0

Ok, wiki đã sao lưu. Đó là một cách tiếp cận thực sự tốt đẹp. Điều đó thực sự phải là một phần của Catalyst, hoặc ít nhất là một plugin .... – derobert

3

Cập nhật: Dựa trên phản hồi của bạn về đề xuất trước đó của tôi, tôi quyết định cắn viên đạn và xem tài liệu Catalyst. Dường như với tôi, là nơi để làm điều này là trong:

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 
} 

phản ứng trước: tôi không sử dụng chất xúc tác, nhưng có thể bạn không chỉ cần viết một tiểu cho các ứng dụng của bạn?

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

Gọi với set_default_response_headers($c->response->headers).

+0

Vâng, tôi có thể viết một tiểu, nhưng sau đó tôi vẫn phải nhớ để gọi nó trong mọi phương pháp ... và nếu nó bị lãng quên trong bất kỳ phương pháp điều khiển, nó dẫn đến một lỗi có thể xảy ra. Dường như một cách tiếp cận khá mong manh – derobert

Các vấn đề liên quan