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::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メンバーには、ブートストラップクラスの初期化に使用される引数が入力されます。
したがって、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

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モデルでその値を定義する代わりに。

したがって、uはur変数を初期化するだけでよく、uはurから値を取得します di.xml

それが役に立てば幸い


それは私の質問に答えないので、それは本当に助けにはなりません。動作のconstとinit_parameterの違いを尋ねました。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.