di.xml tipo constante vs parámetro_inicial

8

Veo en los di.xmlarchivos del núcleo que algunos de los argumentos tienen el tipo, init_parameterpero los valores de los parámetros son 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>

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

y muchos otros.
Pero por lo que veo en el intérprete asociado init_parameter, se usa el intérprete constanteMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Pero el resultado es un poco diferente del 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']);
}

¿Alguien puede explicar por favor cómo funciona el init_parametertipo y cómo sucede todo bajo el capó?

Marius
fuente

Respuestas:

17

Lo encontré.
Para constel valor de la constante especificada se utiliza.
Para init_parameter, el valor proporcionado debe ser un nombre constante pero el valor real utilizado es el valor de $_SERVER[constant value here].

En el método Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod encontrarás esto

    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']se ve muy similar a lo que devuelve el intérprete de parámetros init.
Y si hay un valor con la clave $argument['argument']en el globalArgumentsmiembro, se devuelve uno.
globalArgumentsmember se rellena con los argumentos con los que se inicializa la clase bootstrap.
Entonces, para la aplicación web, estos argumentos son $_SERVER. (ver index.php).

Conclusión:

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

significa que el parámetro nombrado appModetendrá el valor $_SERVER[Magento\Framework\App\State::PARAM_MODE]si está configurado.
Lo que significa$_SERVER['MAGE_MODE']

Marius
fuente
2
Creo que esta información debería agregarse a la documentación oficial. Gracias por la exploración detallada. :)
Siarhey Uchukhlebau
1

¿Cuáles son todos los valores permitidos de `xsi: type` en los xml de Magento2

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

ingrese la descripción de la imagen aquí

Formato de nodo : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Descripción : El argumento global de una aplicación representada por Constant::NAMEse busca y se pasa como argumento.
Valores posibles : Constante el argumento global que contiene el nombre

Formato de nodo : <argument xsi:type="const">{Constant::NAME}</argument>
Descripción : Constante :: NOMBRE pasado como argumento.
Valores posibles : todos los nombres constantes son posibles.

Tomemos el siguiente ejemplo.

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

La idea es simple. Puede pasar directamente sus variables y su valor desde el di.xmlarchivo. En lugar de definir esos valores en su modelo.

Así que solo necesita inicializar sus variables y obtendrá valor de su di.xml

Espero eso ayude

Ankit Shah
fuente
Realmente no ayuda porque no responde mi pregunta. Pedí la diferencia entre const y init_parameter en comportamiento.
Marius