Ein eigener Cache-Typ für den Prämienkatalog: etc/cache.xml und Type::TYPE_IDENTIFIER
Ein eigener Cache-Typ für den Prämienkatalog: etc/cache.xml und Type::TYPE_IDENTIFIER
~6 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
Der Prämienkatalog aus Block 2 wird eine EAV-Collection mit mehreren Joins sein - teuer genug, um sie nicht bei jedem Seitenaufruf neu zu berechnen. Magento löst das nicht mit einer beliebigen Cache-Bibliothek, sondern mit einem eigenen Cache-Typ, der sich nahtlos in Admin > System > Cache Management, bin/magento cache:clean und bin/cache-clean einreiht.
Warum schon in Block 1, wenn der Katalog erst in Block 2 entsteht?
Der Cache-Typ selbst hat keine Abhängigkeit zur Prämien-Entity - er ist nur ein benannter Container, den beliebiger Code später befüllen und leeren kann. Ihn früh anzulegen bedeutet, dass Block 2 direkt loslegen kann, ohne zuerst Cache-Infrastruktur nachzuziehen. Das ist derselbe Grund, aus dem Kapitel 7 die Konfiguration schon jetzt bereitstellt, obwohl noch keine Zeile Code sie ausliest.
etc/cache.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/Cache/etc/cache.xsd">
<type name="mironsoft_loyalty_catalog" translate="label,description"
instance="Mironsoft\Loyalty\Model\Cache\Type\LoyaltyCatalog">
<label>Loyalty Reward Catalog</label>
<description>Cached reward catalog data used by the loyalty and rewards program.</description>
</type>
</config>name ist der eindeutige Bezeichner, mit dem der Cache-Typ auf der Admin-Seite Cache Management und in der CLI angesprochen wird. instance verweist auf die PHP-Klasse, die das eigentliche Frontend-Cache-Objekt bereitstellt.
Model\Cache\Type\LoyaltyCatalog
Die Klasse selbst enthält kaum Logik - sie bindet nur einen eigenen, getaggten Cache-Frontend-Bereich an den Identifier aus cache.xml. TagScope sorgt dafür, dass bin/magento cache:clean mironsoft_loyalty_catalog ausschließlich Einträge mit diesem Tag löscht, nicht den kompletten Cache.
<?php
declare(strict_types=1);
namespace Mironsoft\Loyalty\Model\Cache\Type;
use Magento\Framework\App\Cache\Type\FrontendPool;
use Magento\Framework\Cache\Frontend\Decorator\TagScope;
/**
* Custom cache type for the loyalty reward catalog (populated starting in block 2).
*/
class LoyaltyCatalog extends TagScope
{
/**
* @var string
*/
public const TYPE_IDENTIFIER = 'mironsoft_loyalty_catalog';
/**
* @var string
*/
public const CACHE_TAG = 'mironsoft_loyalty_catalog';
/**
* @param FrontendPool $cacheFrontendPool Provides the shared cache frontend instance for this type.
*/
public function __construct(FrontendPool $cacheFrontendPool)
{
parent::__construct(
$cacheFrontendPool->get(self::TYPE_IDENTIFIER),
self::CACHE_TAG
);
}
}Tipp: TYPE_IDENTIFIER und CACHE_TAG sind identisch gewählt - das ist bei Magentos eigenen Cache-Typen (Magento\Catalog\Model\Cache\Type, Magento\PageCache\Model\Cache\Type) ebenfalls üblich, aber keine Pflicht. Wichtig ist nur, dass TYPE_IDENTIFIER exakt dem name-Attribut aus cache.xml entspricht.
Den Cache-Typ prüfen
bin/magento cache:flush
bin/magento cache:status | grep mironsoft_loyalty_catalogAchtung: Ein neuer Cache-Typ taucht in bin/magento cache:status erst nach einem vollständigen cache:flush beziehungsweise einem Neuladen der Konfiguration auf - ein reines cache:clean reicht nicht immer, wenn der Typ gerade erst per cache.xml registriert wurde.
Kapitel 9 schließt Block 1 mit dem letzten fehlenden Baustein ab: einem Konsolenbefehl, der den Punkte-Ledger aus Kapitel 3 bis 6 aktiv nutzt, statt nur seine Infrastruktur bereitzustellen.