Zum Hauptinhalt springen

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-Artikel
  • customized_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

Klassesupports()Besonderheit
ProductLineItemContextResolver$lineItem->getType() === LineItem::PRODUCT_LINE_ITEM_TYPELä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.