Ben bu durumda ben eylem önbelleğe alma ve önbelleğe alma görünümü bir arada kullanmak düşünüyorum. Ben sorunu çözmek için farklı önbellek motorları, sadece temel kaprisleri girmeyeceğim.
Yapmanız gereken ilk şey, üzerinde önbelleğe açmak olduğunu. app/config/core.php, bir kaç değişiklik yapmak gerekir. İlk olarak, Cache.disable satırını açıklama:
//Configure::write('Cache.disable', true);
İkincisi, Cache.check satırı yorumsuz:
Configure::write('Cache.check', true);
Son olarak, tüm görüşlere CacheHelper kullanılabilir hale, öylesine $helpers üye tanımını eklemek gerekir app/app_controller.php:
class AppController extends Controller
{
var $helpers = array('Cache');
}
Sonra, biz kategori menü içeren görünümü öğe ayarlamak (kontrolör şeyler geriye biraz görünebilir önce görünümü şeyler yapıyor, ama bana ayı ile - bu mantıklı olacak) olacak. Bir görünüm öğesi menü koyarak <cake:no-cache></cake:no-cache> etiketleri ile uncached gibi seçilerek büyük bir görünümü veya düzen parçaları belirlemek için çalışırken biraz daha basit, önbelleğe alma yapar.
Burada basit bir Sırasız listede kategori menü oluşturma, örnek bir görünüm elemanın (<ul>):
<?php
$menuItems = $this->requestAction(array('controller'=>'categories','action'=>'menu'));
echo $html->nestedList( $menuItems, 'ul' );
?>
Sen yepyeni bir sevk başlatır gibi requestAction, kötü olduğunu geçmişte bir veya daha fazla kişi tarafından söylendi olabilir. Bu doğrudur. Sen requestAction veba gibi önlemek, except bunu gitmek için en iyi yolu, bu durumda, görünüm-önbelleğe bu tür yapıyoruz. Gerekir
Biz app/views/elements/category_menu.ctp olarak bu yeni görünüm öğe saklamak gerekir. requestAction in menu hareket çağırır CategoriesController. İşte o zaman ben yavaş bunun üzerinden biraz gidersiniz gibi CategoriesController görünüyor:
class CategoriesController extends AppController
{
var $cacheAction = array(
'menu/' => '1 day'
);
function menu()
{
return $this->Category->find('list', array(
'fields' => array('Category.id','Category.label'),
'order' => array('Category.order')
));
}
}
Bu ne yapar:
- Için üye tanımı
$cacheAction o 1 gün için menu eylemin sonuçlarını önbelleğe gerektiğini Cake söyler.
menu yöntemi değerler olarak Category.id tuşları olarak kullanarak, ve Category.label, kategorilerden bir tek-boyutlu bir dizi döndürür.
Yani, biz şimdiye kadar ne var üzerine gidelim. Biz CategoriesController::menu hareket talep a category_menu elemanı vardır. Bu istek alındığında, Cake bu eylem sonucu önbelleğe alınmış ve süresi dolmamış olup olmadığını görmek için kontrol eder. Önbelleğe alınan sonuç hala geçerli ise, Cake biz tanımlanan menu yöntemini çağırarak olmadan dönecektir. Aksi takdirde, Kek yöntemini çağırmak, ve sonucu önbelleğe alacaktır. Görünümü elemanı daha sonra bir nestedList olarak sonuç vermektedir.
Tüm bu kalıntılar, daha sonra diğer görünümlerde görünüm elemanı kullanmaktır. İşte basit bir örnek var: app/views/layouts/default.ctp:
<html>
[ snip... ]
<body>
<div class="category-menu">
<?php echo $this->element('category_menu', array('cache'=>'1 day')); ?>
</div>
<div class="content">
<p>Lorem ipsum sit dolor amet.</p>
</div>
</body
</html>
Biz View::element daha önce oluşturduğunuz category_menu görünümü elemanını işlemek için tanıdık kullanabilirsiniz, ancak biz de bu hale sürümünü önbelleğe sonra, biz o zamanlar görünüm elemanını işlemek istiyorum Kek söyle, ve Bir ay boyunca bu ana tutunmak. Bir ay geçtikten ya da önbelleği temizleyene kadar bu öğe için herhangi bir sonraki istekleri, önceden render görünümü elemanı teslim edecek. Hatta yorumlamak app/views/elements/category_menu.ctp, çok daha az requestAction çağırmak veya veritabanı vurmak olmaz.
Eğer Category modeli kayıtları immesiately yansıtılır yaptığınız değişiklikleri sağlamak için, oluşturmak / update eylemler global işlevini clearCache() çağırabilirsiniz. Bir ihtar hakkında clearCache(): inelegant ama etkili: Bir av tüfeği yaklaşımın bir parçasıdır. clearCache() yerine seçici sadece gerekli görüşlerini temizleyerek daha, tüm önbelleğini siler. Ancak, basit bir yaklaşım olduğunu ve önbelleği yeniden oluşturmak zorunda, aylık kategoriler güncelleme bahsediyoruz verilen ayda bir kez muhtemelen daha seçici yaklaşım azalmış güçlük değer.
Çok uzun bir cevap! HTH