Caching & Page Listener
Caching ist ein wichtiger Bestandteil einer performanten und SEO-optimierten Web-Seite. Dieser Artikel behandelt dieses Thema im Zusammenhang mit Page Controllern. Du erfährst ausserdem, wie Callbacks für Änderungen an Seiten registriert werden können.
Caching
Wie im Artikel Page Controller beschrieben, funktionieren Page Controller gleich wie normale Controller. Dies bedeutet auch, dass du den Response Cache, Http Cache oder View Cache steuern kannst, wie du es dir aus normalen Controllern gewohnt bist.
class ExamplePageController extends PageController { private static function _annos(AnnoInit $ai) { $ai->m('standardPage', new AnnoPage(), new AnnoPageCiPanels('main', 'aside')); } public function standardPage() { $this->assignResponseCacheControl(new \DateInterval('P1D')); $this->assignHttpCacheControl(new \DateInterval('PT30M')); $this->forward('\atusch\view\standardPage.html'); } }
Im oben stehenden Beispiel haben wir unter anderem den Response Cache auf einen Tag gesetzt. Damit wir nach Änderungen an einer Seite (z. B. neuer Titel oder neues Content Item) nicht bis zu einem Tag warten müssen bis die Änderungen angezeigt werden, bietet das Page-Modul in der Konfiguration die Option "cacheClearedOnPageEvent". Ist diese aktiviert, wird nach jeder Änderung an einer Seite (Page Event) der komplette Response- und View-Cache gelöscht.
Page Events verarbeiten
Ein Page Event tritt auf, sobald ein mit dem Page-Modul verwandtes Entity-Objekt (Datensatz) hinzugefügt, geändert oder gelöscht wird. Dies betrifft alle Entities, die sich im Namespace page\bo
befinden oder PageController
erweitern. Zu einem Page Event führen also zum Beispiel Änderungen am Titel oder an den Content Items einer Seite oder auch, wenn ein Page Controller oder eine Page-Methode gewechselt wird.
Du hast zwei Möglichkeiten, Page Events abzufangen.
Callback
Die erste und wohl einfachere Variante ist, im jeweiligen Page Controller eine magische Callback-Methode _onPageChange()
zu implementieren.
class ExamplePageController extends PageController { private static function _annos(AnnoInit $ai) { $ai->m('standardPage', new AnnoPage(), new AnnoPageCiPanels('main', 'aside')); } public function standardPage() { $this->assignResponseCacheControl(new \DateInterval('P1D'), false, array('t' => 'standardPage')); $this->assignHttpCacheControl(new \DateInterval('PT30M')); $this->forward('\atusch\view\standardPage.html'); } private function _onPageChange(ResponseCacheStore $responseCacheStore) { $responseCacheStore->removeByCharacteristics(array('t' => 'standardPage')); } }
Die magische Methode _onPageChange()
wird ausgeführt, sobald sich an einer Seite vom Typ "standardPage" etwas ändert. Bei Änderungen an Page Controllern, für die du eine solche Callback-Methode implementiert hast, wird der Response und View Cache nicht automatisch gelöscht, auch wenn in der Konfiguration die Option "cacheClearedOnPageEvent" aktiviert ist. Du musst dies also manuell erledigen, zum Beispiel über ResponseCacheStore::clear()
oder ViewCacheStore::clear()
. Dies gibt dir aber auch die Möglichkeit, den Cache, wie im oben stehenden Beispiel, selektiver zu löschen.
Um mehr Informationen über den aktuellen Page Event zu erfahren, kannst du _onPageChange()
ein Objekt vom Typ page\model\PageEvent
magisch übergeben lassen.
Page Listener
Die zweite Variante ist, wie im Artikel Konfiguration beschrieben, einen Page Listener zu registrieren.
<?php namespace atusch\model; use page\model\PageListener; use page\model\PageEvent; use n2n\model\RequestScoped; class ExamplePageListener implements PageListener, RequestScoped { public function onPageEvent(PageEvent $pageEvent) { // code } public function onFlush() { // code } }
Ein Page Listener muss page\model\PageListener
implementieren und lookupable sein. Für jeden auftretenden Page Event wird PageListener::onPageEvent()
ausgeführt. Bevor die Änderungen persistiert werden, wird noch PageListener::onFlush()
aufgerufen.