Magento 2帮助程序以及在phtml中使用帮助程序方法的最佳方法

问题描述 投票:0回答:1

似乎有几种方法可以加载要在phtml文件中使用的助手。但是,我不太了解这种方式的优缺点。

  1. 似乎Magento 2首选的方法是创建一个自定义块,并在构造中加载帮助程序...
namespace Company\Module\Block;

use \Magento\Framework\View\Element\Template\Context;
use \Company\Module\Helper\Data;


class Module extends \Magento\Framework\View\Element\Template
{

    private $_helper;

    public function __construct(Context $context, Data $helper)
    {
        $this->_helper = $helper;
        parent::__construct($context);
    }

    public function isLoggedIn()
    {

        return $this->_helper->isUserLoggedIn();
    }

}

然后在phtml中像这样使用:

$block->isLoggedIn()
  1. 似乎不鼓励使用(但可行)的另一种方法是通过phtml加载帮助程序:
$helper = $this->helper('Company\Module\Helper\Data');
$helper->isLoggedIn();
  • 为什么不鼓励?

最后...

  1. 如果我以不需要代理方法的方式使我的助手public成为块,将被认为是不好的做法吗?
namespace Company\Module\Block;

use \Magento\Framework\View\Element\Template\Context;
use \Company\Module\Helper\Data;


class Module extends \Magento\Framework\View\Element\Template
{

    public $helper;

    public function __construct(Context $context, Data $helper)
    {
        $this->helper = $helper;
        parent::__construct($context);
    }

然后根据需要在phtml中使用:

$block->helper->isLoggedIn()

喜欢听听这三种在phtml中使用帮助器的想法。我更喜欢使用方法#2,因为那样我就不必仅在phtml文件中使用帮助程序就可以创建自定义块。但是,如果这将导致严重的速度下降或问题,我将避免它。

magento2
1个回答
1
投票

还有另一种扩展Magento 2块功能的方法。它称为View Models

您可以在这里找到文档:https://devdocs.magento.com/guides/v2.3/extension-dev-guide/view-models.html

注意:View模型从Magento 2.2开始可用。

简单示例

布局XML文件checkout_cart_item_renderers.xml

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

查看模型本身:

namespace OrangeCompany\Catalog\ViewModel;

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

以及您的phtml文件:

<?php

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

$viewModel = $block->getViewModel();

?>
<h1><?= $block->escapeHtml($viewModel->getTitle()); ?></h1>
© www.soinside.com 2019 - 2024. All rights reserved.