Zahlungsarten Filter

Einführung

Der Zahlungsarten Filter besteht aus dem Filter BestitKlarnaPayments\Components\PaymentMethodFilter\PaymentMethodFilter und die diversen Contraints. Der Filter geht die einzelnen Constraints durch und führt diese aus. Während die Constraints je nach Logik die einzelnen Zahlungsarten rausfiltern.

Constraint erweitern

Um ein Constraint zu erweitern kann das Decorator Pattern verwendet werden. Um, zum Beispiel, den UserAddressConstraint so zu erweitern, dass auch die Straße gleich sein muss kann folgender Code genutzt werden:

<?php

namespace App\Constraints;

use BestitKlarnaPayments\Components\PaymentMethodFilter\ConstraintInterface;
use BestitKlarnaPayments\Components\PaymentMethodFilter\FilterHelper;
use BestitKlarnaPayments\Components\Shared\UserInsights;

class UserAddressConstraint implements ConstraintInterface
{
    /** @var ConstraintInterface */
    protected $decoratedConstraint;
    /** @var UserInsights */
    protected $userInsights;
    /** @var FilterHelper */
    protected $filterHelper;

    public function __construct(
        ConstraintInterface $decoratedConstraint,
        UserInsights $userInsights,
        FilterHelper $filterHelper
    ) {
        $this->decoratedConstraint = $decoratedConstraint;
        $this->userInsights = $userInsights;
        $this->filterHelper = $filterHelper;
    }

    public function check(array $paymentMethods)
    {
        // Calls the original constraint
        $paymentMethods = $this->decoratedConstraint->check($paymentMethods);

        $userData = $this->userInsights->getUserData();

        if (empty($userData)) {
            return $paymentMethods;
        }

        $billingAddress = $userData['billingaddress'];
        $shippingAddress = $userData['shippingaddress'];

        if ($billingAddress['street'] !== $shippingAddress['street']) {
            $paymentMethods = $this->filterHelper->removeAllKlarnaPaymentMethods($paymentMethods);
        }

        return $paymentMethods;
    }
}

In der service.xml muss dann der neue Service als Dekorator markiert werden:

<service
        class="App\Constraints\UserAddressConstraint"
        id="app.constraints.user_address_constraint"
        decorates="bestit_klarna_payments.components.payment_method_filter.user_address_constraint">
    <argument type="service" id="app.constraints.user_address_constraint.inner"/>
    <argument type="service" id="bestit_klarna_payments.components.shared.user_insights"/>
    <argument type="service" id="bestit_klarna_payments.components.payment_method_filter.filter_helper"/>
</service>