Dans Magento 2, la $this
variable ne fait plus référence à l'objet bloc d'un modèle. Il fait référence à une classe de modèle
Magento\Framework\View\TemplateEngine\Php
Cependant, cette classe de modèle possède une __call
méthode passthrough
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Ce qui garantit que tous les appels de méthode atteignent le bloc réel. Cela explique également pourquoi vous ne pouvez pas appeler des méthodes protégées à partir de phtml
modèles.
En plus de cela, chaque modèle (je pense?) A une variable nommée $block
peuplée, qui fait également référence à l'objet bloc parent. Vous pouvez voir cela en cours d'utilisation dans le modèle de liste de Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
où la $block
variable est utilisée, mais jamais explicitement définie.
Outre les différences mentionnées ci-dessus, existe-t-il une différence entre l'utilisation d'une technique par rapport à l'autre? ie Faire les deux $block
et se $this->currentBlock
référer au même objet?
$block
Pour autant que j'ai vu, les deux sont presque les mêmes dans PHP TemplateEngineInterface, mais rappelez-vous que dans Magento2, vous pouvez créer des moteurs de modèles personnalisés. Pas comme Magento1 dans lequel vous venez d'avoir des fichiers phtml.
Si vous voyez le,
TemplateEngineInterface
vous ne pouvez voir aucune référence à une méthode appelant lecurrentBlock
, donc je pense que l'$this->currentBlock
approche est spécifique au modèle PHP.Mais pour être indépendant du moteur de modèle,
$block
la bonne approche devrait être.Je veux dire que, d'un point de vue théorique, vous pourriez créer un moteur basé sur PHP différent qui ne pourrait pas s'appuyer sur des fichiers phtml, mais peut-être sur une autre structure PHP.
Je suppose
$block
que c'est la "bonne" façon pour le mode "phtml" car il est explicitement passé en tant que variable de contexte.$block
et$this->currentBlock
sont les mêmes d'un point de vue technique, mais s'ils les utilisent explicitement,$block
je pense que nous devrions les utiliser, d'un point de vue stylistique.la source