Was ist die Verwendung des "Mapping" -Knotens in di.xml in Magento 2?

8

Ich benutze Magento 2.2.5

Schauen Sie sich die Datei an

Hersteller \ magento \ module-sales \ etc \ di.xml

<type name="Magento\Payment\Model\Checks\SpecificationFactory">
    <arguments>
        <argument name="mapping" xsi:type="array">
            <item name="country" xsi:type="object">Magento\Payment\Model\Checks\CanUseForCountry</item>
            <item name="currency" xsi:type="object">Magento\Payment\Model\Checks\CanUseForCurrency</item>
            <item name="checkout" xsi:type="object">Magento\Payment\Model\Checks\CanUseCheckout</item>
            <item name="internal" xsi:type="object">Magento\Payment\Model\Checks\CanUseInternal</item>
            <item name="total" xsi:type="object">Magento\Payment\Model\Checks\TotalMinMax</item>
            <item name="zero_total" xsi:type="object">Magento\Payment\Model\Checks\ZeroTotal</item>
        </argument>
    </arguments>
</type>

Es gibt einen Knoten mit dem Namen " Mapping ". Hat jemand eine Idee über seine Verwendung?

Ich habe die Frage Magento 2 gelesen - In welchem ​​Fall verwende ich di.xml und wie verwende ich di.xml für ein Modul? und Alan Sturms Artikel "Magento 2 Object Manager Argument Replacement"

Vielen Dank

Knight017
quelle

Antworten:

2

Wenn Sie überprüfen , Magento\Payment\Model\Checks\SpecificationFactoryvon derconstrut

public function __construct(\Magento\Payment\Model\Checks\CompositeFactory $compositeFactory, array $mapping)
    {
        $this->compositeFactory = $compositeFactory;
        $this->mapping = $mapping;
    }

Beim zweiten Argument array $mappingim Array erhalten Sie alle Argumente, die Sie definiert habendi.xml

BEARBEITEN

In construct $this->mappingfinden Sie alle Objekte in dem Array, in dem Sie definiert haben di.xml.

Wenn Sie beispielsweise festlegen <argument name="mappingtest" xsi:type="array">, müssen Sie definieren construct als

 public function __construct(
\Magento\Payment\Model\Checks\CompositeFactory $compositeFactory, array $mappingytest
) {
    $this->compositeFactory = $compositeFactory;
    $this->mapping = $mapping;
}

Hier $mappingytest

Keyur Shah
quelle
Ich habe dies gesehen, kann aber die Logik dieser Datei nicht verstehen. Sie wollen damit sagen, wenn wir einen mappingKnoten verwenden, wird hier in der jeweiligen Typklasse ein Array-Parameter hinzugefügt: 'Magento \ Payment \ Model \ Checks \ SpecificationFactory'.
Knight017
Bezieht sich dies auf das letzte Argument, das wir im Konstruktor aller Modelle übergeben, das Array $ data = [] ?
Knight017
Ja, es bezieht sich auf den letzten Parameter, wie in meiner Antwort erwähntmapping
Keyur Shah
Haben Sie noch Fragen? @ Knight017 :)
Keyur Shah
Nein, eigentlich habe ich die Antwort durch Bearbeiten Ihrer Antwort abgeschlossen. Aber irgendwie zeigt es sich jetzt nicht.
Knight017
2

Der Objektmanager fügt die Implementierungsklasse Magento \ Core \ Model \ Url überall dort ein, wo im globalen Bereich eine Anforderung für Magento \ Core \ Model \ UrlInterface besteht.

Mehrfachvalidierung für verschiedene Module mit abgelegt.

<argument name="mapping" xsi:type="array">
                <item name="country" xsi:type="object">Magento\Payment\Model\Checks\CanUseForCountry</item>
                <item name="currency" xsi:type="object">Magento\Payment\Model\Checks\CanUseForCurrency</item>
                <item name="checkout" xsi:type="object">Magento\Payment\Model\Checks\CanUseCheckout</item>
                <item name="internal" xsi:type="object">Magento\Payment\Model\Checks\CanUseInternal</item>
                <item name="total" xsi:type="object">Magento\Payment\Model\Checks\TotalMinMax</item>
                <item name="zero_total" xsi:type="object">Magento\Payment\Model\Checks\ZeroTotal</item>
            </argument>

Überprüfen Sie nun die SpecificationFactory- Datei auf Geschäftslogik.

Anbieter / Magento / Modulzahlung / Modell / Schecks / SpezifikationFactory.php

class SpecificationFactory
{
    /**
     * Composite Factory
     *
     * @var \Magento\Payment\Model\Checks\CompositeFactory
     */
    protected $compositeFactory;

    /**
     * @var array
     */
    protected $mapping;

    /**
     * Construct
     *
     * @param \Magento\Payment\Model\Checks\CompositeFactory $compositeFactory
     * @param array $mapping
     */
    public function __construct(\Magento\Payment\Model\Checks\CompositeFactory $compositeFactory, array $mapping)
    {
        $this->compositeFactory = $compositeFactory;
        $this->mapping = $mapping;
    }

    /**
     * Creates new instances of payment method models
     *
     * @param array $data
     * @return Composite
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function create($data)
    {
        $specifications = array_intersect_key($this->mapping, array_flip((array)$data));
        return $this->compositeFactory->create(['list' => $specifications]);
    }
}

Es validiert das Mapping-Datenmodul weise.

$specifications = array_intersect_key($this->mapping, array_flip((array)$data));
Aditya Shah
quelle
0

Fazit

Das Gespräch mit @Keyur Shah und der Vorschlag von @Jignesh Khunt kommen zu dem Schluss, dass Sie hier Konfigurationen hinzufügen di.xmlund auf Typklassen zugreifen können Magento\Payment\Model\Checks\SpecificationFactory. Im letzten Parameterarray $mappingim folgenden Dateikonstruktor .

Vendor \ Magento \ Module-Payment \ Model \ Checks \ SpecificationFactory.php

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Payment\Model\Checks;

/**
 * Creates complex specification.
 *
 * Use this class to register predefined list of specifications that should be added to any complex specification.
 *
 * @api
 * @since 100.0.2
 */
class SpecificationFactory
{
    /**
     * Composite Factory
     *
     * @var \Magento\Payment\Model\Checks\CompositeFactory
     */
    protected $compositeFactory;

    /**
     * @var array
     */
    protected $mapping;

    /**
     * Construct
     *
     * @param \Magento\Payment\Model\Checks\CompositeFactory $compositeFactory
     * @param array $mapping
     */
    public function __construct(\Magento\Payment\Model\Checks\CompositeFactory $compositeFactory, array $mapping)
    {
        $this->compositeFactory = $compositeFactory;
        $this->mapping = $mapping;
    }

    /**
     * Creates new instances of payment method models
     *
     * @param array $data
     * @return Composite
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function create($data)
    {
        $specifications = array_intersect_key($this->mapping, array_flip((array)$data));
        return $this->compositeFactory->create(['list' => $specifications]);
    }
}

Der Argumentknoten (hier " $ Mapping ") muss eine Mitgliedsvariable der Typklasse ( Magento\Payment\Model\Checks\SpecificationFactory) sein.

Dann sind die von Ihnen übergebenen Daten di.xmlin Ihrer Factory-Klasse zugänglich und verwendbar, und Sie können die Logik anpassen. Ich habe die dynamische Klasse mithilfe dieser Funktion anhand der im $ Mapping-Array verfügbaren Daten (ohne Umschreiben oder Plugin / Prefrence) initialisiert.

Knight017
quelle