W Magento 2 $this
zmienna nie odnosi się już do obiektu bloku szablonu. Odnosi się do klasy szablonów
Magento\Framework\View\TemplateEngine\Php
Jednak ta klasa szablonów ma __call
metodę przekazywania
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Które zapewniają, że wszelkie wywołania metod przechodzą do faktycznego bloku. To wyjaśnia również, dlaczego nie można wywoływać metod chronionych z phtml
szablonów.
Oprócz tego każdy (myślę?) Szablon ma zmienną o nazwie $block
zapełniona, która również odnosi się do obiektu bloku rodzica. Możesz to zobaczyć w szablonie listy Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
gdzie $block
używana jest zmienna, ale nigdy nie została wyraźnie zdefiniowana.
Czy poza różnicami wspomnianymi powyżej jest jakaś różnica między użyciem jednej techniki nad drugą? tj. Czy oba $block
i $this->currentBlock
odnoszą się do tego samego obiektu?
$block
O ile widziałem, oba są prawie takie same w PHP TemplateEngineInterface, ale pamiętaj, że w Magento2 możesz tworzyć niestandardowe silniki szablonów. Nie tak jak Magento1, w którym właśnie miałeś pliki phtml.
Jeśli widzisz
TemplateEngineInterface
, nie widzisz żadnego odwołania do żadnej metody wywołującejcurrentBlock
, więc myślę, że$this->currentBlock
podejście jest specyficzne dla szablonu PHP.Ale aby być niezależnym od silnika szablonów,
$block
powinno być właściwe podejście.Mam na myśli, że z teoretycznego punktu widzenia możesz stworzyć inny silnik oparty na PHP, który nie mógłby polegać na plikach phtml, ale może na innej strukturze PHP.
Zakładam, że
$block
jest to „właściwy” sposób dla trybu „phtml”, ponieważ jest jawnie przekazywany jako zmienna kontekstowa.$block
i$this->currentBlock
są takie same z technicznego punktu widzenia, ale jeśli zostały wyraźnie użyte$block
, myślę, że powinniśmy go użyć, z punktu widzenia stylu kodu.źródło