Konstantentyp di.xml vs init_parameter

8

Ich sehe in den di.xmlDateien aus dem Kern, dass einige der Argumente den Typ haben, init_parameteraber die Werte der Parameter sind alle Konstanten.

<type name="Magento\Framework\View\Page\Config\Renderer">
    <arguments>
        <argument name="appMode" xsi:type="init_parameter">Magento\Framework\App\State::PARAM_MODE</argument>
    </arguments>
</type>

oder dieses

<type name="Magento\Framework\App\Cache\State">
    <arguments>
        <argument name="banAll" xsi:type="init_parameter">Magento\Framework\App\Cache\State::PARAM_BAN_CACHE</argument>
    </arguments>
</type>

und viele andere.
Aber von dem, was ich in dem zugehörigen Interpreter sehe init_parameter, wird der konstante Interpreter verwendetMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

public function evaluate(array $data)
{
    return ['argument' => $this->constInterpreter->evaluate($data)];
}

Aber das Ergebnis ist ein bisschen anders als das Magento\Framework\Data\Argument\Interpreter\Constant::evaluate

 public function evaluate(array $data)
{
    if (!isset($data['value']) || !defined($data['value'])) {
        throw new \InvalidArgumentException('Constant name is expected.');
    }
    return constant($data['value']);
}

Kann mir bitte jemand erklären, wie der init_parameterTyp funktioniert und wie alles unter der Haube passiert?

Marius
quelle

Antworten:

16

Fand es.
Für constden Wert wird die angegebene Konstante verwendet.
Für init_parameter, sofern der Wert eine Konstante Name verwendet werden muss , aber der tatsächliche Wert ist der Wert $_SERVER[constant value here].

In der Methode Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod finden Sie dies

    else if ($argument === (array)$argument) {
        if (isset($argument['argument'])) {
            if (isset($this->globalArguments[$argument['argument']])) {
                $argument = $this->globalArguments[$argument['argument']];
            } else {
                $argument = $paramDefault;
            }
        } else if (!empty($argument)) {
            $this->parseArray($argument);
        }
    }

$argument['argument']sieht dem vom init-Parameterinterpreter zurückgegebenen sehr ähnlich.
Und wenn es einen Wert mit dem Schlüssel $argument['argument']im globalArgumentsMitglied gibt, wird dieser zurückgegeben.
globalArgumentsDas Mitglied wird mit den Argumenten gefüllt, mit denen die Bootstrap-Klasse initialisiert wird.
Für die Webanwendung sind diese Argumente also $_SERVER. (siehe index.php).

Fazit:

<argument name="appMode" xsi:type="init_parameter">Magento\Framework\App\State::PARAM_MODE</argument>

bedeutet, dass der genannte Parameter appModeden Wert hat, $_SERVER[Magento\Framework\App\State::PARAM_MODE]wenn er gesetzt ist.
Was bedeutet$_SERVER['MAGE_MODE']

Marius
quelle
2
Ich denke, diese Informationen sollten der offiziellen Dokumentation hinzugefügt werden. Vielen Dank für die detaillierte Erkundung. :)
Siarhey Uchukhlebau
1

Was sind alle erlaubten xsi: type-Werte in den XML-Dateien von Magento2?

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/di-xml-file.html

Geben Sie hier die Bildbeschreibung ein

Knotenformat : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Beschreibung : Das globale Argument einer durch dargestellten Anwendung Constant::NAMEwird nachgeschlagen und als Argument übergeben.
Mögliche Werte : Konstante des globalen Arguments, das den Namen enthält

Knotenformat : <argument xsi:type="const">{Constant::NAME}</argument>
Beschreibung : Constant :: NAME als Argument übergeben.
Mögliche Werte : Alle Konstantennamen sind möglich.

Nehmen wir das folgende Beispiel.

magento \ vendor \ magento \ module-store \ etc \ di.xml

<type name="Magento\Store\Model\StoreResolver">
    <arguments>
        <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>
        <argument name="runMode" xsi:type="init_parameter">Magento\Store\Model\StoreManager::PARAM_RUN_TYPE</argument>
        <argument name="scopeCode" xsi:type="init_parameter">Magento\Store\Model\StoreManager::PARAM_RUN_CODE</argument>
    </arguments>
</type>

magento \ vendor \ magento \ module-store \ Model \ StoreResolver.php

/**
 * @var string
 */
protected $runMode;

/**
 * @var string
 */
protected $scopeCode;

/**
 * @param \Magento\Store\Api\StoreRepositoryInterface $storeRepository
 * @param StoreCookieManagerInterface $storeCookieManager
 * @param \Magento\Framework\App\RequestInterface $request
 * @param \Magento\Framework\Cache\FrontendInterface $cache
 * @param StoreResolver\ReaderList $readerList
 * @param string $runMode
 * @param null $scopeCode
 */
public function __construct(
    \Magento\Store\Api\StoreRepositoryInterface $storeRepository,
    StoreCookieManagerInterface $storeCookieManager,
    \Magento\Framework\App\RequestInterface $request,
    \Magento\Framework\Cache\FrontendInterface $cache,
    StoreResolver\ReaderList $readerList,
    $runMode = ScopeInterface::SCOPE_STORE,
    $scopeCode = null
) {
    $this->storeRepository = $storeRepository;
    $this->storeCookieManager = $storeCookieManager;
    $this->request = $request;
    $this->cache = $cache;
    $this->readerList = $readerList;
    $this->runMode = $scopeCode ? $runMode : ScopeInterface::SCOPE_WEBSITE;
    $this->scopeCode = $scopeCode;
}

Die Idee ist einfach. Sie können Ihre Variablen und ihren Wert direkt aus der di.xmlDatei übergeben. Anstatt diese Werte in Ihrem Modell zu definieren.

Sie müssen also nur Ihre Variablen initialisieren und erhalten den Wert von ur di.xml

Ich hoffe es hilft

Ankit Shah
quelle
Es hilft nicht wirklich, weil es meine Frage nicht beantwortet. Ich habe nach dem Unterschied zwischen const und init_parameter im Verhalten gefragt.
Marius