Cursos Magento

Quando usar getSingleton e getModel?

, ,

Atualizado em 16 de fevereiro de 2022

Uma dúvida muito comum quando estamos iniciando no desenvolvimento para Magento (1) é porque em alguns lugares do Magento um model é chamado usando o método Mage::getModel e em outros Mage::getSingleton.
A explicação no entanto é bastante simples, mas para ficar ainda mais óbvio, vamos entender o que é Singleton.

O que é Singleton?

Por definição (entenda Wikipedia), singleton é um pattern/padrão de desenvolvimento que restringe a inicialização de uma classe a um único objeto.
Em outras palavras inicializarmos determinada classe pela segunda vez, ao invés de termos um segundo objeto teremos a classe anterior reaproveitada.

E o Mage::getSingleton?

No Magento não é diferente. Quando chamamos Mage::getSingleton, vamos ter como retorno a instância de um Model, da mesma forma que teríamos com Mage::getModel, porém se o Model já tiver sido instanciado anteriormente, a mesma classe será aproveitada. Caso contrário, será iniciada e salva em memória(na classe Mage) como podemos concluir abaixo:#

# Arquivo: app/Mage.php
/**
* Retrieve model object singleton
*
* @param string $modelClass
* @param array $arguments
* @return Mage_Core_Model_Abstract
*/
public static function getSingleton($modelClass='', array $arguments=array())
{
	$registryKey = '_singleton/'.$modelClass;
	
	if (!self::registry($registryKey)) {
		self::register($registryKey, self::getModel($modelClass, $arguments));
	}
	
	return self::registry($registryKey);
}

Isso é útil em várias situações, em especial quando temos certeza que queremos lidar sempre com a mesma instância de um Model sem iniciar diversas vezes a mesma classe em uma mesma requisição.
A essa altura você já deve ter tido aquele momento “a-há!” e percebido que a maioria das vezes que queremos buscar ou iniciar algo na session do Magento vemos getSingleton ao invés de getModel, não é mesmo?

Inclusive, se fizer uma busca com a expressão regular getModel\(.*session.*\) em todo o Magento, encontrará pouquíssimas ocorrências. Isso porque a sessions são um ótimo exemplo de classes que não deveriam ser re-instanciadas.

Resultados de getModel com sessions
Resultados de getModel com sessions
Resultados de getSingleton com sessions
Resultados de getSingleton com sessions

Como podemos concluir, singletons são muito úteis nos casos onde não precisamos criar uma nova instância de classe, ou reaproveitar um objeto criado.

Já os Models… bom, é o oposto. Mas você vai ver muito sobre eles no curso de desenvolvimento de módulos para Magento que vêm por aí. 😉
Para ficar por dentro, é só colocar seu e-mail na caixa aqui da lateral >>

Gostou?
Compartilhe! Deixe seus comentários!

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-1/desenvolvimento/backend/quando-usar-getsingleton-e-getmodel/"]