No Magento 2, a $this
variável não se refere mais ao objeto de bloco de um modelo. Refere-se a uma classe de modelo
Magento\Framework\View\TemplateEngine\Php
No entanto, essa classe de modelo possui um __call
método de passagem
#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
return call_user_func_array([$this->_currentBlock, $method], $args);
}
O que garante que qualquer chamada de método chegue ao bloco real. Isso também explica por que você não pode chamar métodos protegidos de phtml
modelos.
Além disso, todo modelo (eu acho?) Tem uma variável denominada $block
preenchida, que também se refere ao objeto de bloco pai. Você pode ver isso em uso no modelo de lista do Magento
#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();
onde a $block
variável é usada, mas nunca definida explicitamente.
Além das diferenças mencionadas acima, existe alguma diferença entre usar uma técnica sobre a outra? ie Faça os dois $block
e se $this->currentBlock
refira ao mesmo objeto?
$block
Até onde eu vi, ambos são quase os mesmos no PHP TemplateEngineInterface, mas lembre-se de que no Magento2 você pode criar mecanismos de modelos personalizados. Não é como o Magento1, no qual você tinha apenas arquivos phtml.
Se você vir o,
TemplateEngineInterface
não poderá ver nenhuma referência a nenhum método que chame ocurrentBlock
, então acho que a$this->currentBlock
abordagem é específica do modelo PHP.Mas, para ser independente do mecanismo do modelo,
$block
deve ser a abordagem correta.Quero dizer que, do ponto de vista teórico, você poderia criar um mecanismo diferente baseado em PHP que não pudesse confiar em arquivos phtml, mas talvez em alguma outra estrutura PHP.
Eu assumo
$block
como o caminho "certo" para o modo "phtml" porque é explicitamente passado como variável de contexto.$block
e$this->currentBlock
são os mesmos do ponto de vista técnico, mas se eles explicitamente usaram$block
, acho que deveríamos usá-lo, do ponto de vista do estilo do código.fonte