Sylius Media Alt Text: Erweiterbarkeit
Sylius Media Alt Text erweitern: Resolver und Manager als Services, eigene Fallback-Provider mit Tag und Priorität, weitere Bildtypen über die Registry sowie Normalizer-Priorität.
Sylius Media Alt Text: Erweiterbarkeit
Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.
Services
| Service / Interface | Zweck |
|---|---|
Mmd\SyliusMediaAltTextPlugin\Resolver\AltTextResolverInterface |
Löst den Text eines Bildes auf (resolve, resolveWithFallback, isDecorative) |
Mmd\SyliusMediaAltTextPlugin\Manager\AltTextManagerInterface |
Schreibt Texte und Kennzeichen eines Bildes (apply), validiert dabei Sprache und Länge |
Beide Interfaces sind als öffentliche Alias-Services registriert und lassen sich per Autowiring einbinden. AltTextManagerInterface::apply() ersetzt alle Texte eines Bildes und persistiert sie, ruft aber kein flush() auf, das übernimmt der Aufrufer. Mit MediaAltTextSettingsProvider::isActive() fragst Du den Schalter „Alt-Texte ausgeben“ ab.
Fallback-Provider
Ein Fallback-Provider liefert den Text, wenn kein gepflegter Text da ist. Das Plugin bringt OwnerNameFallbackProvider mit: Er nimmt den Produkt- bzw. Kategorienamen, bei Avatars den Namen des Admin-Benutzers.
Eigene Provider implementieren das Interface:
use Mmd\SyliusMediaAltTextPlugin\Resolver\AltTextFallbackProviderInterface;
use Sylius\Component\Core\Model\ImageInterface;
final class MyFallbackProvider implements AltTextFallbackProviderInterface
{
public function supports(ImageInterface $image): bool
{
return $image instanceof MyImage;
}
public function fallbackFor(ImageInterface $image, string $locale, bool $exactLocale = false): ?string
{
return 'Mein Text';
}
}
Das Tag mmd_sylius_media_alt_text.fallback_provider vergibt das Plugin nur für seine eigenen Services. Einen Provider in Deiner App musst Du selbst taggen:
services:
App\Alt\MyFallbackProvider:
tags:
- { name: mmd_sylius_media_alt_text.fallback_provider, priority: 10 }
Die Provider werden nach Priorität gefragt (höher zuerst), der erste nicht leere Text gewinnt. OwnerNameFallbackProvider hat die Standardpriorität 0 und antwortet für Produkt- und Kategoriebilder mit dem Namen, sobald einer vorhanden ist. Ein eigener Provider für diese Bildtypen kommt nur zum Zug, wenn Du ihm eine höhere Priorität gibst. $exactLocale = true verlangt einen Namen genau in der angegebenen Sprache (so arbeitet der Backfill-Befehl).
Weitere Bildtypen
Die Zuordnung „Bild-Interface => Alt-Text-Entity“ steckt im Service mmd_sylius_media_alt_text.registry (ImageAltTextTypeRegistry). Sie ist ein reines Konstruktor-Argument, es gibt kein Tag, mit dem sich ein Typ von außen eintragen lässt.
Um einen weiteren Bildtyp abzudecken, brauchst Du:
- eine eigene Entity, die
AbstractImageAltTexterweitert undImageAltTextInterfaceimplementiert (mit Mapping und Migration für Deine Tabelle) - eine Überschreibung des Services
mmd_sylius_media_alt_text.registryin Deiner App, die beide Arrays um Deinen Typ ergänzt (Interface => Entity und Kurzname => Interface)
Der Kurzname ist der Wert, den der Backfill-Befehl bei --type annimmt.
Normalizer und Persist-Processor
- Der Normalizer
mmd_sylius_media_alt_text.normalizer.imageläuft mit Priorität 65, vor dem Bild-Normalizer von Sylius (Priorität 64). Hängst Du eigene Normalizer für Bilder ein, plane diese Reihenfolge ein. mmd_sylius_media_alt_text.state_processor.persistdekoriert den Persist-Processor von API Platform für alle Doctrine-Operationen. Er wirkt nur auf Bilder, die die Registry kennt, alle anderen Objekte reicht er unverändert weiter.
Das Plugin dokumentiert keine Abwärtskompatibilitäts-Zusage für Interfaces und Service-IDs. Leite bei eigenem Code lieber von den genannten Interfaces ab, statt von konkreten Klassen.