di.xml常量类型vs 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类型如何工作以及一切在引擎盖下如何发生吗?

Answers:


17

找到了。
对于const指定常量的值。
为此init_parameter,提供的值必须是常量名称,但实际使用的值是的值$_SERVER[constant value here]

在该方法中Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod,你会发现

    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一个返回成员。
globalArguments用初始化bootstrap类的参数填充成员。
因此对于Web应用程序,这些参数是$_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
我认为此信息应添加到官方文档中。感谢您的详细探索。:)
Siarhey Uchukhlebau '18

1

Magento2的xml中所有允许的`xsi:type`值是什么?

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>
说明:常量:: NAME作为参数传递。
可能的值:所有常量名称都是可能的。

让我们来看下面的例子。

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

想法很简单。您可以直接从di.xml文件传递变量及其值。而不是在ur Model中定义该值。

因此,您只需要初始化ur变量,就会从ur中获得价值 di.xml

希望能帮助到你


它没有真正的帮助,因为它不能回答我的问题。我询问了const和init_parameter在行为上的区别。
马里斯(Marius)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.