тип константы di.xml против init_parameter

8

Я вижу в di.xmlфайлах из ядра, что некоторые аргументы имеют тип, init_parameterно значения параметров являются постоянными.

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

или этот

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

и много других.
Но из того, что я вижу в интерпретаторе, связанном с init_parameterконстантой, используетсяMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Но результат немного отличается от 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']);
}

Может кто-нибудь объяснить, пожалуйста, как init_parameterработает тип и как все происходит под капотом?

Мариус
источник

Ответы:

17

Нашел это.
Для constзначения указанной константы используется.
Для init_parameter, предоставленное значение должно быть именем константы, но фактическое используемое значение является значением $_SERVER[constant value here].

В методе метод Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentвы найдете это

    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']выглядит очень похоже на то, что возвращает интерпретатор параметра init.
И если есть значение с ключом $argument['argument']в globalArgumentsчлене, то оно возвращается.
globalArgumentsmember заполняется аргументами, с которыми инициализируется класс начальной загрузки.
Так что для веб-приложения эти аргументы есть $_SERVER. (см. index.php).

Вывод:

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

означает, что названный параметр appModeбудет иметь значение, $_SERVER[Magento\Framework\App\State::PARAM_MODE]если оно установлено.
Что значит$_SERVER['MAGE_MODE']

Мариус
источник
2
Я думаю, что эта информация должна быть добавлена ​​к официальной документации. Спасибо за подробное исследование. :)
Сергей Учухлебау
1

Каковы все допустимые значения `xsi: type` в xml из Magento2

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

введите описание изображения здесь

Формат узла : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Описание : Глобальный аргумент приложения, представленный Constant::NAMEкак, ищется и передается как аргумент.
Возможные значения : постоянное глобальное имя, содержащее аргумент

Формат узла : <argument xsi:type="const">{Constant::NAME}</argument>
Описание : Константа :: ИМЯ передана в качестве аргумента.
Возможные значения : все имена констант возможны.

Давайте рассмотрим пример ниже.

Magento \ поставщика \ Magento \ модульно-магазин \ и т.д. \ 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 \ поставщика \ Magento \ модульно-магазин \ 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;
}

Идея проста. Вы можете напрямую передать свои переменные и их значение из di.xmlфайла. Вместо того, чтобы определять эти значения в вашей модели.

Так что вам просто нужно инициализировать переменные ur, и вы получите значение от ur di.xml

Надеюсь, поможет

Анкит Шах
источник
Это не очень помогает, потому что не отвечает на мой вопрос. Я спросил разницу между const и init_parameter в поведении.
Мариус