di.xml tipe konstan vs init_parameter

8

Saya melihat dalam di.xmlfile - file dari inti bahwa beberapa argumen memiliki tipe init_parametertetapi nilai-nilai parameter semua konstanta.

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

atau yang ini

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

dan banyak lagi.
Tetapi dari apa yang saya lihat dalam interpreter yang terkait init_parameter, interpreter konstan digunakanMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Tetapi hasilnya agak berbeda dari 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']);
}

Bisakah seseorang menjelaskan tolong bagaimana init_parametertipenya bekerja dan bagaimana semuanya terjadi di bawah tenda?

Marius
sumber

Jawaban:

17

Menemukannya.
Untuk constnilai konstanta yang ditentukan digunakan.
Untuk init_parameter, nilai yang diberikan harus berupa nama konstan tetapi nilai aktual yang digunakan adalah nilai $_SERVER[constant value here].

Dalam metode Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod Anda akan menemukan ini

    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']terlihat sangat mirip dengan apa yang dikembalikan oleh penerjemah parameter init.
Dan jika ada nilai dengan kunci $argument['argument']di globalArgumentsanggota yang dikembalikan.
globalArgumentsanggota diisi dengan argumen yang menginisialisasi kelas bootstrap.
Jadi untuk aplikasi web argumen ini $_SERVER. (lihat index.php).

Kesimpulan:

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

berarti bahwa parameter bernama appModeakan memiliki nilai $_SERVER[Magento\Framework\App\State::PARAM_MODE]jika disetel.
Yang berarti$_SERVER['MAGE_MODE']

Marius
sumber
2
Saya pikir informasi ini harus ditambahkan ke dokumentasi resmi. Terima kasih untuk eksplorasi terperinci. :)
Siarhey Uchukhlebau
1

Apa semua nilai `xsi: type` yang diizinkan dalam xml dari Magento2

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

masukkan deskripsi gambar di sini

Format simpul : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Deskripsi : Argumen global dari suatu aplikasi yang diwakili Constant::NAMEdilihat dan diteruskan sebagai argumen.
Nilai yang mungkin : Konstan argumen global yang berisi nama

Format Node : <argument xsi:type="const">{Constant::NAME}</argument>
Keterangan : Constant :: NAME diberikan sebagai argumen.
Nilai yang mungkin : Semua nama konstan adalah mungkin.

Mari kita ambil contoh di bawah ini.

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

Ide itu sederhana. Anda dapat langsung mengirimkan variabel Anda & nilainya dari di.xmlfile. Alih-alih mendefinisikan nilai-nilai itu dalam Model Anda.

Jadi Anda hanya perlu menginisialisasi variabel Anda & Anda akan mendapatkan nilai dari Anda di.xml

Semoga ini bisa membantu

Ankit Shah
sumber
Itu benar-benar tidak membantu karena tidak menjawab pertanyaan saya. Saya meminta perbedaan antara const dan init_parameter dalam perilaku.
Marius