Modèles Magento 2: utilisez `$ block` ou` $ this`?

27

Dans Magento 2, la $thisvariable 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 __callmé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 phtmlmodèles.

En plus de cela, chaque modèle (je pense?) A une variable nommée $blockpeuplé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 $blockvariable 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 $blocket se $this->currentBlockréférer au même objet?

Alan Storm
la source

Réponses:

33

Dans un fichier modèle, $blocket $this->_currentBlockc'est la même chose.

Jetez un oeil à la renderméthode dans le Php.phpmoteur de modèle.
Avant d'inclure le fichier modèle, cela se produit: $this->_currentBlock = $block;alors le fichier modèle est inclus à l'aide d'un simple include $fileName;.
Cela signifie qu'à l'intérieur d'un modèle, vous êtes toujours à l'intérieur du Phpmoteur de modèle. C'est pourquoi ça $thismarche, et c'est pourquoi $blockest défini.

[EDIT]
Je viens de découvrir que l'utilisation de $thismodèles internes est déconseillée.
Le renifleur php avec les normes EcgM2 affiche un avertissement lors de l'utilisation de $thismodèles internes.
Remplacer $thispar $blockfait disparaître l'avertissement.

Marius
la source
Quel est donc l'objet par défaut dans le fichier .phtml $ block ou $ this.
Manish Goswami
Que voulez-vous dire par défaut?
Marius
Quelle est la variable par défaut utilisée dans un modèle pour accéder à la classe de rendu du modèle? Y a-t-il une différence entre ces deux pour accéder à la fonction?
Manish Goswami
Il dit en ny réponse. Les deux fonctionnent mais il est recommandé d'utiliser$block
Marius
5

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, TemplateEngineInterfacevous ne pouvez voir aucune référence à une méthode appelant le currentBlock, donc je pense que l' $this->currentBlockapproche est spécifique au modèle PHP.

Mais pour être indépendant du moteur de modèle, $blockla 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 $blockque c'est la "bonne" façon pour le mode "phtml" car il est explicitement passé en tant que variable de contexte.

$blocket $this->currentBlocksont les mêmes d'un point de vue technique, mais s'ils les utilisent explicitement, $blockje pense que nous devrions les utiliser, d'un point de vue stylistique.

Phoenix128_RiccardoT
la source
Mais $ block ne fait pas non plus partie de l'interface. Je dirais qu'il est sûr de supposer que cette implémentation est utilisée lorsque vous êtes dans un fichier phtml. Les autres implémentations n'utiliseront pas le fichier phtml.
Fabian Schmengler
Vous avez raison, je n'ai pas été clair dans ma réponse pour expliquer ce que je veux dire. J'ai modifié mon message avec plus de détails.
Phoenix128_RiccardoT