Шаблоны Magento 2: использовать `$ block` или` $ this`?

27

В 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шаблонов.

В дополнение к этому, хотя, каждый (я думаю?) Шаблон имеет переменную с именем $blockpopulated, которая также ссылается на объект родительского блока. Вы можете увидеть это в использовании в шаблоне списка Magento

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

где $blockпеременная используется, но никогда не определяется явно.

Кроме упомянутых выше различий, есть ли разница между использованием одного метода над другим? т.е. оба $blockи $this->currentBlockотносятся к одному и тому же объекту?

Алан Сторм
источник

Ответы:

32

В файле шаблона $blockи $this->_currentBlockто же самое.

Взгляните на renderметод в Php.phpшаблонизаторе.
Перед включением файла шаблона это происходит: $this->_currentBlock = $block;тогда файл шаблона включается с помощью простого include $fileName;.
Это означает, что внутри шаблона вы все еще находитесь внутри Phpмеханизма шаблонов. Вот почему $thisработает, и именно поэтому $blockопределяется.

[EDIT]
Я только что узнал, что использование $thisвнутренних шаблонов не рекомендуется.
Анализатор php со стандартами EcgM2 выдает предупреждение при использовании $thisвнутри шаблонов.
Замена $thisна $blockделает предупреждение исчезает.

Мариус
источник
Итак, который является объектом по умолчанию в .phtml файле $ block или $ this.
Маниш Госвами
Что вы имеете в виду по умолчанию?
Мариус
Какая переменная по умолчанию используется в шаблоне для доступа к классу визуализации шаблона? Есть ли разница между этими двумя функциями доступа?
Маниш Госвами
Это говорит в любом ответе. Обе работы, но рекомендуется использовать$block
Мариус
5

Насколько я видел, они оба почти одинаковы в PHP TemplateEngineInterface, но помните, что в Magento2 вы можете создавать собственные механизмы шаблонов. В отличие от Magento1, в котором у вас только что были файлы phtml.

Если вы видите, что TemplateEngineInterfaceвы не видите никакой ссылки на какой-либо метод, вызывающий currentBlock, поэтому я думаю, что $this->currentBlockподход зависит от шаблона PHP.

Но для того, чтобы быть независимым от шаблонизатора, $blockдолжен быть правильный подход.

Я имею в виду, что с теоретической точки зрения вы могли бы создать другой движок на основе PHP, который не мог бы полагаться на файлы phtml, но, возможно, на какую-то другую структуру PHP.

Я полагаю, $blockчто «правильный» способ для режима «phtml», потому что он явно передается в качестве переменной контекста.

$blockи $this->currentBlockто же самое с технической точки зрения, но если они явно используются, $blockя думаю, что мы должны использовать это, с точки зрения стиля кода.

Phoenix128_RiccardoT
источник
Но ни один из блоков не является частью интерфейса. Я бы сказал, что можно предположить, что эта реализация используется, когда вы находитесь внутри phtml-файла. Другие реализации не будут использовать файл phtml.
Фабиан Шменглер
Вы правы, я не совсем ясно объяснил, что я имею в виду. Я изменил свой пост с более подробной информацией.
Phoenix128_RiccardoT