В Magento 2 $this
переменная больше не ссылается на блочный объект шаблона. Это относится к шаблону класса
Magento\Framework\View\TemplateEngine\Php
Тем не менее, этот шаблонный класс имеет сквозной __call
метод
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Которые гарантируют, что любые вызовы метода дойдут до фактического блока. Это также объясняет, почему нельзя вызывать защищенные методы из phtml
шаблонов.
В дополнение к этому, хотя, каждый (я думаю?) Шаблон имеет переменную с именем $block
populated, которая также ссылается на объект родительского блока. Вы можете увидеть это в использовании в шаблоне списка Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
где $block
переменная используется, но никогда не определяется явно.
Кроме упомянутых выше различий, есть ли разница между использованием одного метода над другим? т.е. оба $block
и $this->currentBlock
относятся к одному и тому же объекту?
$block
Насколько я видел, они оба почти одинаковы в PHP TemplateEngineInterface, но помните, что в Magento2 вы можете создавать собственные механизмы шаблонов. В отличие от Magento1, в котором у вас только что были файлы phtml.
Если вы видите, что
TemplateEngineInterface
вы не видите никакой ссылки на какой-либо метод, вызывающийcurrentBlock
, поэтому я думаю, что$this->currentBlock
подход зависит от шаблона PHP.Но для того, чтобы быть независимым от шаблонизатора,
$block
должен быть правильный подход.Я имею в виду, что с теоретической точки зрения вы могли бы создать другой движок на основе PHP, который не мог бы полагаться на файлы phtml, но, возможно, на какую-то другую структуру PHP.
Я полагаю,
$block
что «правильный» способ для режима «phtml», потому что он явно передается в качестве переменной контекста.$block
и$this->currentBlock
то же самое с технической точки зрения, но если они явно используются,$block
я думаю, что мы должны использовать это, с точки зрения стиля кода.источник