magento2中使用ViewModel方式

7天成为Magento系统架构师,现在开始学习Magento全栈开发!

《Magento2.X企业级开发实战》

视图模型是视图的抽象,公开了公共属性和命令。 它允许开发人员将功能和业务逻辑从块类卸载到更易于维护、测试和重用的单独类中。

何时使用视图模型
任何时候您需要将功能注入模板文件并且您的代码不需要与 Magento 向后兼容时,都可以使用这种方法。

视图模型在 Magento 2.2 以后可用。 如果您的代码必须与旧版本的 Magento 兼容,请考虑将您的逻辑添加到块中。

如何编写视图模型
可以通过将视图模型类作为参数传递给页面布局配置文件中的模板块来使用视图模型。 在以下示例代码段中,MyNewViewModel 是作为参数传递给块的 ExampleCorp_Catalog 模块的视图模型类。

<block name="examplecorp.new.viewmodel" template="ExampleCorp_Catalog::example.phtml">
    <arguments>
        <argument name="view_model" xsi:type="object">ExampleCorp\Catalog\ViewModel\MyNewViewModel</argument>
    </arguments>
</block>

在以下示例中,相同的视图模型与 Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml 中的现有块一起使用。

<referenceBlock name="checkout.cart.item.renderers.default">
    <arguments>
        <argument name="view_model" xsi:type="object">ExampleCorp\Catalog\ViewModel\MyNewViewModel</argument>
    </arguments>
</referenceBlock>

视图模型类必须始终实现接口 \Magento\Framework\View\Element\Block\ArgumentInterface。 例如:

namespace ExampleCorp\Catalog\ViewModel;

class MyNewViewModel implements \Magento\Framework\View\Element\Block\ArgumentInterface
{
    public function getTitle()
    {
      return 'Hello World';
    }
}

您可以访问模板中视图模型类的公共方法:

<?php

/** @var $viewModel \ExampleCorp\Catalog\ViewModel\MyNewViewModel */

$viewModel = $block->getViewModel();

?>
<h1><?= $block->escapeHtml($viewModel->getTitle()); ?></h1>

视图模型示例
Magento 主题。 这个 view_model 被注入到模板中以返回目标商店重定向 url。
以下是 Magento/Catalog/view/frontend/layout/catalog_product_view.xml 布局文件中的视图模型使用示例。

视图模型类作为参数传递给布局配置文件中的 product.info.upsell 块:

<block class="Magento\Catalog\Block\Product\ProductList\Upsell" name="product.info.upsell" template="Magento_Catalog::product/list/items.phtml">
    <arguments>
        <argument name="type" xsi:type="string">upsell</argument>
        <argument name="view_model" xsi:type="object">Magento\Catalog\ViewModel\Product\Listing\PreparePostData</argument>
    </arguments>
</block>

以下是目录模块中视图模型类 Magento/Catalog/ViewModel/Product/Listing/PreparePostData.php 实现的示例。

该类必须实现 \Magento\Framework\View\Element\Block\ArgumentInterface 接口类。

namespace Magento\Catalog\ViewModel\Product\Listing;

use Magento\Framework\View\Element\Block\ArgumentInterface;
use Magento\Framework\App\ActionInterface;
use Magento\Framework\Url\Helper\Data as UrlHelper;

/**
 * Check is available add to compare.
 */
class PreparePostData implements ArgumentInterface
{
    /**
     * @var UrlHelper
     */
    private $urlHelper;

    /**
     * @param UrlHelper $urlHelper
     */
    public function __construct(UrlHelper $urlHelper)
    {
        $this->urlHelper = $urlHelper;
    }

    /**
     * Wrapper for the PostHelper::getPostData()
     *
     * @param string $url
     * @param array $data
     * @return array
     */
    public function getPostData(string $url, array $data = []):array
    {
        if (!isset($data[ActionInterface::PARAM_NAME_URL_ENCODED])) {
            $data[ActionInterface::PARAM_NAME_URL_ENCODED] = $this->urlHelper->getEncodedUrl();
        }
        return ['action' => $url, 'data' => $data];
    }
}

以下是 app/code/Magento/Catalog/view/frontend/templates/product/list/items.phtml 模板中的视图模型初始化示例。

/** @var $viewModel /Magento/Catalog/ViewModel/Product/Listing/PreparePostData */
$viewModel = $block->getViewModel();
$postArray = $viewModel->getPostData(
    $block->escapeUrl($block->getAddToCartUrl($_item)),
    ['product' => $_item->getEntityId()]
);
如无特殊说明或标注,任何个人或组织,复制、转载、采集本站内容请注明:
本文来源于:【Magento中文网】,并添加本文地址链接。
如未按上述操作复制或转载,本站有权追究法律责任。
若本站内容侵犯了原著者的合法权益,可联系我们进行处理。