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

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


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));

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.