No Magento 1, se você deseja passar dados da sua ação do Controller para a "View" (ou seja, um bloco no seu layout, você pode)
Adicione um valor / objeto ao registro global via
Mage::register
Buscar diretamente um objeto de bloco e definir propriedades de dados no objeto de bloco buscado após executar
loadLayout
Chame métodos em objetos de bloco em
phtml
arquivos e faça com que os objetos de bloco usem a camada de modelo / banco de dados para ler dados salvos anteriormente na ação do controlador
O uso de métodos de objeto de bloco para ler no banco de dados ainda parece funcionar no Magento 2 - o que é apropriado para certos tipos de operações. Contudo,
Não há mais um registro global no Magento 2 (ou existe?)
O sistema de layout agora funciona criando um objeto de página através de uma fábrica, e você não pode pegar referências de bloco da mesma maneira que no Magento 1
É possível no Magento 2 passar dados diretamente de uma ação do controlador para uma visualização? Ou isso é um padrão muito direto para o admirável mundo novo Design Pattern ™ do Magento? Se esse é um padrão muito direto, o que deve ser feito se houver alguma informação calculada que desejamos exibir em um modelo, mas não queremos armazenar essas informações em um sistema com estado (por exemplo, não queremos salvá-las no diretório base de dados)
Posso pensar em uma maneira diferente de cortar isso juntos - mas estou interessado em saber como o Magento 2 quer que você faça isso.
Nota : Eu sei que é possível buscar uma instância de bloco em uma ação do controlador usando algo como isto
$resultPage = $this->resultPageFactory->create();
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');
var_dump(spl_object_hash($block));
O código principal do Magento 2 faz isso com frequência. No entanto - o objeto de bloco buscado no objeto do controlador parece ser um objeto diferente do que está disponível em um phtml
modelo por meio de $this
ou $block
(o primeiro ( $this
) parece ser o objeto que realmente renderiza o modelo, enquanto o último ( $block
) parece ser uma instância do tipo Magento Block).
#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));
Eu digo "parece ser" porque, se eu definir dados no método de ação do controlador, eles não estarão disponíveis no phtml
modelo - e se eu comparar os spl_object_hash
resultados acima, recebo três hashes diferentes. No entanto, sou novo o suficiente para tudo isso, pois o erro acima pode ter sido algum outro erro - por isso, se você conseguiu definir dados em blocos e buscá-los em um modelo que eu adoraria ouvir sobre isso !
Você não deve passar variáveis da ação do controlador para a exibição. Use o bloco para passar Variáveis para exibição (mecanismo de modelo).
fonte