En Magento 2, la $this
variable ya no hace referencia al objeto de bloque de una plantilla. Se refiere a una clase de plantilla.
Magento\Framework\View\TemplateEngine\Php
Sin embargo, esta clase de plantilla tiene un __call
método passthrough
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
Lo que garantiza que cualquier llamada a un método llegue al bloque real. Esto también explica por qué no puede llamar a métodos protegidos desde phtml
plantillas.
Sin embargo, además de esto, cada plantilla (¿creo?) Tiene una variable denominada $block
poblada, que también se refiere al objeto de bloque principal. Puede ver esto en uso en la plantilla de lista de Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
donde $block
se usa la variable, pero nunca se define explícitamente.
Aparte de las diferencias mencionadas anteriormente, ¿hay alguna diferencia entre usar una técnica sobre la otra? es decir, ¿ambas cosas $block
y se $this->currentBlock
refieren al mismo objeto?
$block
Hasta donde he visto, ambos son casi iguales en PHP TemplateEngineInterface, pero recuerde que en Magento2 puede crear motores de plantillas personalizados. No como Magento1 en el que acaba de tener archivos phtml.
Si ve el
TemplateEngineInterface
no puede ver ninguna referencia a ningún método que llame alcurrentBlock
, por lo que creo que el$this->currentBlock
enfoque es específico de la plantilla de PHP.Pero para ser independiente del motor de plantillas,
$block
debe ser el enfoque correcto.Quiero decir que, desde el punto de vista teórico, podría crear un motor basado en PHP diferente que no pudiera confiar en archivos phtml, pero tal vez en alguna otra estructura PHP.
Supongo que
$block
es la forma "correcta" para el modo "phtml" porque se pasa explícitamente como variable de contexto.$block
y$this->currentBlock
son lo mismo desde un punto de vista técnico, pero si se usaran explícitamente$block
, creo que deberíamos usarlo, desde el punto de vista del estilo de código.fuente