In Magento 2 $this
verweist die Variable nicht mehr auf das Blockobjekt einer Vorlage. Es bezieht sich auf eine Vorlagenklasse
Magento\Framework\View\TemplateEngine\Php
Diese Vorlagenklasse verfügt jedoch über eine Passthrough- __call
Methode
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Damit stellen Sie sicher, dass alle Methodenaufrufe den eigentlichen Block erreichen. Dies erklärt auch, warum Sie geschützte Methoden nicht aus phtml
Vorlagen aufrufen können .
Darüber hinaus enthält jede (glaube ich?) Vorlage eine Variable mit dem Namen $block
populated, die sich auch auf das übergeordnete Blockobjekt bezieht. Sie können dies in der Listenvorlage von Magento sehen
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
wo die $block
Variable verwendet wird, aber nie explizit definiert.
Gibt es, abgesehen von den oben genannten Unterschieden, einen Unterschied zwischen der Verwendung einer Technik gegenüber der anderen? dh beides $block
und $this->currentBlock
auf dasselbe Objekt verweisen?
$block
Soweit ich gesehen habe, sind beide in PHP TemplateEngineInterface fast gleich, aber denken Sie daran, dass Sie in Magento2 benutzerdefinierte Template-Engines erstellen können. Nicht wie Magento1, in dem Sie gerade HTML-Dateien hatten.
Wenn Sie das sehen
TemplateEngineInterface
, können Sie keinen Verweis auf eine Methode sehen, die das aufruftcurrentBlock
, also denke ich, dass der$this->currentBlock
Ansatz PHP-Template-spezifisch ist.Um aber unabhängig von der Template-Engine zu sein,
$block
sollte der richtige Ansatz gewählt werden.Ich meine, aus theoretischer Sicht könnten Sie eine andere PHP-basierte Engine erstellen, die sich nicht auf PHP-Dateien stützt, sondern auf eine andere PHP-Struktur.
ich nehme an
$block
als "richtigen" Weg für den "phtml" -Modus an, da er explizit als Kontextvariable übergeben wird.$block
und$this->currentBlock
sind vom technischen Standpunkt aus gleich, aber wenn sie ausdrücklich verwendet werden$block
, sollten wir sie meines Erachtens vom Standpunkt des Code-Stils aus verwenden.quelle