loại hằng số di.xml so với init_parameter


8

Tôi thấy trong các di.xmltệp từ lõi có một số đối số có kiểu init_parameternhưng các giá trị của các tham số đều là hằng số.

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

hoặc cái này

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

và nhiều người khác.
Nhưng từ những gì tôi thấy trong trình thông dịch liên quan đến init_parameter, trình thông dịch liên tục được sử dụngMagento\Framework\App\Arguments\ArgumentInterpreter::evaluate

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

Nhưng kết quả hơi khác so với 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']);
}

Ai đó có thể giải thích làm thế nào init_parameterloại hoạt động và làm thế nào mọi thứ xảy ra dưới mui xe?

Câu trả lời:


16

Tìm thấy rồi.
Đối với constgiá trị của hằng số được chỉ định được sử dụng.
Đối với init_parameter, giá trị được cung cấp phải là một tên không đổi nhưng giá trị thực tế được sử dụng là giá trị của $_SERVER[constant value here].

Trong phương pháp Magento\Framework\ObjectManager\Factory\AbstractFactory::resolveArgumentmetohod bạn sẽ tìm thấy điều này

    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']trông rất giống với những gì trình thông dịch init tham số trả về.
Và nếu có một giá trị với khóa $argument['argument']trong globalArgumentsthành viên đó sẽ được trả về.
globalArgumentsthành viên được điền với các đối số mà lớp bootstrap được khởi tạo.
Vì vậy, đối với các ứng dụng web, các đối số là $_SERVER. (xem index.php).

Phần kết luận:

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

có nghĩa là tham số có tên appModesẽ có giá trị $_SERVER[Magento\Framework\App\State::PARAM_MODE]nếu nó được đặt.
Nghĩa là$_SERVER['MAGE_MODE']


2
Tôi nghĩ rằng thông tin này nên được thêm vào tài liệu chính thức. Cảm ơn đã khám phá chi tiết. :)
Siarhey Uchukhlebau

1

Tất cả các giá trị `xsi: type` được phép trong xml là gì từ Magento2

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

nhập mô tả hình ảnh ở đây

Định dạng nút : <argument xsi:type="init_parameter">{Constant::NAME}</argument>
Mô tả : Đối số toàn cầu của một ứng dụng được đại diện bởi Constant::NAMEđược tra cứu và chuyển qua làm đối số.
Các giá trị có thể : Liên tục tên đối số toàn cục

Định dạng nút : <argument xsi:type="const">{Constant::NAME}</argument>
Mô tả : Constant :: NAME được truyền dưới dạng đối số.
Giá trị có thể : Tất cả các tên hằng có thể.

Hãy lấy ví dụ dưới đây.

magento \ eller \ 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 \ eller \ 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;
}

Ý tưởng rất đơn giản. Bạn có thể trực tiếp chuyển các biến của mình và giá trị của nó từ di.xmltệp. Thay vì xác định các giá trị đó trong Mô hình ur.

Vì vậy, bạn chỉ cần khởi tạo các biến ur và bạn sẽ nhận được giá trị từ ur di.xml

Hy vọng nó giúp


Nó không thực sự hữu ích vì nó không trả lời câu hỏi của tôi. Tôi đã yêu cầu sự khác biệt giữa const và init_parameter trong hành vi.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.