tipo constante di.xml vs init_parameter

8

Vejo nos di.xmlarquivos do núcleo que alguns dos argumentos têm o tipo, init_parametermas os valores dos parâmetros são todas 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 este

<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 muitos outros.
Mas pelo que vejo no intérprete associado init_parameter, o intérprete constante é usadoMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Mas o resultado é um pouco diferente do 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']);
}

Alguém pode explicar por favor como o init_parametertipo funciona e como tudo acontece sob o capô?

Marius
fonte

Respostas:

17

Encontrei.
Para consto valor da constante especificada é usado.
Para init_parameter, o valor fornecido deve ser um nome constante, mas o valor real usado é o valor de $_SERVER[constant value here].

No método método, Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentvocê encontrará este

    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']parece muito semelhante ao que o interpretador de parâmetro init retorna.
E se houver um valor com a chave $argument['argument']no globalArgumentsmembro, esse será retornado.
globalArgumentsmember é preenchido com os argumentos com os quais a classe de auto-inicialização é inicializada.
Portanto, para a aplicação web, esses argumentos são $_SERVER. (veja index.php).

Conclusão:

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

significa que o parâmetro nomeado appModeterá o valor $_SERVER[Magento\Framework\App\State::PARAM_MODE]se estiver definido.
Que significa$_SERVER['MAGE_MODE']

Marius
fonte
2
Penso que esta informação deve ser adicionada à documentação oficial. Obrigado pela exploração detalhada. :)
Siarhey Uchukhlebau
1

Quais são todos os valores permitidos `xsi: type` nos xml's do Magento2

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

insira a descrição da imagem aqui

Formato do nó : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Descrição : o argumento global de um aplicativo representado por Constant::NAMEé pesquisado e passado como argumento.
Valores possíveis : Constante o nome global contendo argumento

Formato do nó : <argument xsi:type="const">{Constant::NAME}</argument>
Descrição : Constant :: NAME passado como argumento.
Valores possíveis : Todos os nomes de constantes são possíveis.

Vamos dar um exemplo abaixo.

magento \ fornecedor \ magento \ loja de módulos \ 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 \ fornecedor \ magento \ módulo-loja \ 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;
}

A ideia é simples. Você pode passar diretamente suas variáveis ​​e seu valor do di.xmlarquivo. Em vez de definir esses valores em seu modelo.

Então você só precisa inicializar suas variáveis ​​e você obterá valor delas di.xml

Espero que ajude

Ankit Shah
fonte
Realmente não ajuda, porque não responde à minha pergunta. Eu pedi a diferença entre const e init_parameter no comportamento.
Marius