LineItemContextResolver
Warum gibt es Resolver?
Beim Aufbau der Übertragung iteriert der Connector über alle Positionen (LineItems) des Warenkorbs. Eine Warenkorbposition kann jedoch unterschiedliche Typen haben:
product– ein normaler Shopware-Artikelcustomized_product– ein konfigurierbares Produkt- eigene Typen – z.B. Pseudo-Produkte aus einem Drittanbieter-Plugin
Jeder dieser Typen benötigt ggf. eine andere Vorgehensweise, um den DataFieldResolutionContext aufzubauen (z.B. muss für ein product-LineItem das ProductEntity über das Repository nachgeladen werden).
Der AbstractLineItemContextResolver kapselt diese Logik und entscheidet, ob er für ein gegebenes LineItem zuständig ist.
Aufbau
abstract class AbstractLineItemContextResolver
{
// Gibt zurück ob dieser Resolver für das LineItem zuständig ist.
abstract public function supports(LineItem $lineItem): bool;
// Baut den DataFieldResolutionContext auf (oder gibt null zurück um das LineItem zu überspringen).
public function resolve(
LineItem $lineItem,
Cart $cart,
ConnectorSystemEntity $system,
ConnectorSession $session,
SalesChannelContext $salesChannelContext
): ?DataFieldResolutionContext { ... }
}
Die Standard-Implementierung von resolve() erstellt direkt einen DataFieldResolutionContext mit dem LineItem. Für komplexere Fälle (z.B. Repository-Lookups) kann resolve() überschrieben werden.
Eingebaute Resolver
| Klasse | supports() | Besonderheit |
|---|---|---|
ProductLineItemContextResolver | $lineItem->getType() === LineItem::PRODUCT_LINE_ITEM_TYPE | Lädt das ProductEntity über sales_channel.product.repository nach |
CustomizedProductLineItemContextResolver | $lineItem->getType() === 'customized-products' | Lädt das Basis-Produkt und ergänzt Customized-Product-Daten |
Eigenen Resolver anlegen
Einen eigenen Resolver braucht man, wenn eigene LineItem-Typen (z.B. von Drittanbieter-Plugins) behandelt werden sollen.
class MyCustomContextResolver extends AbstractLineItemContextResolver
{
public function supports(LineItem $lineItem): bool
{
return $lineItem->getType() === 'my-custom-type';
}
// resolve() muss nur überschrieben werden wenn der Standard-Context nicht ausreicht
}
Registrierung in services.xml:
<service id="MyPlugin\Connector\DataField\LineItemContextResolver\MyCustomContextResolver">
<tag name="agiqon_connector.line_item_context_resolver"/>
</service>
Der Tag agiqon_connector.line_item_context_resolver sorgt dafür, dass der Resolver automatisch vom Connector gefunden wird.