tipo costante di.xml vs init_parameter


8

Vedo nei di.xmlfile dal core che alcuni degli argomenti hanno il tipo init_parameterma i valori dei parametri sono tutti costanti.

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

o questo

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

e molti altri.
Ma da quello che vedo nell'interprete associato init_parameter, viene usato l'interprete costanteMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Ma il risultato è un po 'diverso dal 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']);
}

Qualcuno può spiegare per favore come funziona il init_parametertipo e come tutto accade sotto il cofano?

Risposte:


17

Trovato.
Per constil valore della costante specificata viene utilizzato.
Per init_parameter, il valore fornito deve essere un nome costante ma il valore effettivo utilizzato è il valore di $_SERVER[constant value here].

Nel metodo Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod troverai questo

    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']sembra molto simile a ciò che restituisce l'interprete del parametro init.
E se esiste un valore con la chiave $argument['argument']nel globalArgumentsmembro, viene restituito uno.
globalArgumentsil membro viene popolato con gli argomenti con cui viene inizializzata la classe bootstrap.
Quindi per l'applicazione Web questi argomenti sono $_SERVER. (vedi index.php).

Conclusione:

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

significa che il parametro denominato appModeavrà il valore $_SERVER[Magento\Framework\App\State::PARAM_MODE]se è impostato.
Che significa$_SERVER['MAGE_MODE']


2
Penso che queste informazioni debbano essere aggiunte alla documentazione ufficiale. Grazie per l'esplorazione dettagliata. :)
Siarhey Uchukhlebau,

1

Quali sono tutti i valori `xsi: type` consentiti negli XML da Magento2

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

inserisci qui la descrizione dell'immagine

Formato nodo : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Descrizione : l'argomento globale di un'applicazione rappresentata da Constant::NAMEviene cercato e passato come argomento.
Valori possibili : costante il nome globale dell'argomento

Formato nodo : <argument xsi:type="const">{Constant::NAME}</argument>
Descrizione : Costante :: NAME passato come argomento.
Valori possibili : sono possibili tutti i nomi di costanti.

Facciamo l'esempio seguente.

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 \ modello \ 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;
}

L'idea è semplice. Puoi passare direttamente le tue variabili e il loro valore dal di.xmlfile. Invece di definire quei valori nel tuo modello.

Quindi devi solo inizializzare le tue variabili e otterrai valore da te di.xml

Spero che sia d'aiuto


Non aiuta davvero perché non risponde alla mia domanda. Ho chiesto la differenza tra const e init_parameter nel comportamento.
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.