Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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

app/code/Mironsoft/Loyalty/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.

app/code/Mironsoft/Loyalty/Model/Cache/Type/LoyaltyCatalog.php
<?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_catalog

Achtung: 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.