type constant di.xml vs paramètre_init


8

Je vois dans les di.xmlfichiers du noyau que certains des arguments ont le type init_parametermais les valeurs des paramètres sont toutes des constantes.

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

ou celui-ci

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

et plein d'autres.
Mais d'après ce que je vois dans l'interprète associé init_parameter, l'interprète constant est utiliséMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Mais le résultat est un peu différent du 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']);
}

Quelqu'un peut-il expliquer comment fonctionne le init_parametertype et comment tout se passe sous le capot?

Réponses:


17

Je l'ai trouvé.
Pour constla valeur de la constante spécifiée est utilisée.
Pour init_parameter, la valeur fournie doit être un nom constant mais la valeur réelle utilisée est la valeur de $_SERVER[constant value here].

Dans la méthode Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod vous trouverez ceci

    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']ressemble beaucoup à ce que renvoie l'interpréteur de paramètre init.
Et s'il existe une valeur avec la clé $argument['argument']dans le globalArgumentsmembre, celle-ci est renvoyée.
globalArgumentsLe membre est rempli avec les arguments avec lesquels la classe d'amorçage est initialisée.
Donc, pour l'application Web, ces arguments sont $_SERVER. (voir index.php).

Conclusion:

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

signifie que le paramètre nommé appModeaura la valeur $_SERVER[Magento\Framework\App\State::PARAM_MODE]s'il est défini.
Ce qui signifie$_SERVER['MAGE_MODE']


2
Je pense que ces informations devraient être ajoutées à la documentation officielle. Merci pour l'exploration détaillée. :)
Siarhey Uchukhlebau

1

Quelles sont toutes les valeurs autorisées de «xsi: type» dans les xml de Magento2

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

entrez la description de l'image ici

Format de nœud : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Description : L'argument global d'une application représentée par Constant::NAMEest recherché et passé en argument.
Valeurs possibles : Constante l'argument global contenant le nom

Format de nœud : <argument xsi:type="const">{Constant::NAME}</argument>
Description : Constant :: NAME passé en argument.
Valeurs possibles : Tous les noms de constantes sont possibles.

Prenons l'exemple ci-dessous.

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

L'idée est simple. Vous pouvez directement transmettre vos variables et sa valeur à partir du di.xmlfichier. Au lieu de définir ces valeurs dans votre modèle.

Donc, il vous suffit d'initialiser les variables ur et vous obtiendrez de la valeur de ur di.xml

J'espère que cela aide


Ça n'aide pas vraiment parce que ça ne répond pas à ma question. J'ai demandé la différence entre const et init_parameter dans le comportement.
Marius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.