Certificação Magento – Métodos de Fábrica

Prosseguindo com nossos bate-papos sobre Magento, aqui temos as formas de se instanciar classes e criar objetos no Magento.

Neste post vamos aprender a instanciar objetos através dos métodos de fábrica, para ser o mais prático possível antes devo explicar que você deve conhecer o nome da classe e da entidade que você quer instanciar.

magento-imagem-01

Segundo o Magento U as classes de fábrica servem para basicamente três coisas:

– Instanciar models (regras de negócio que se conectam a base de dados) e classes de recursos do magento, os Resources que serão abordados em tópico oportuno.
– Criar helpers para vendas e instanciar blocos de template
– Instanciar controllers para criação de CMS

Por exemplo se você quer dados dos produtos, você deve saber que todo produto é um entidade da classe catálogo, portanto você terá que criar um objeto catálogo e invocar a entidade produto através do seguinte comando:

$product = Mage::getModel(‘catalog/product’);

Todo método de fábrica passa obrigatoriamente por uma determinação do arquivo Mage.php na pasta app, que irá direcionar para a classe certa, esse arquivo além de participar da inicialização da sua loja ele também invoca qualquer método nativo da Magento de qualquer lugar do código (dentro do Magento é claro) através de seu parent Mage::. É como se você tivesse tirando um coelho da cartola toda vez que instanciar essa classe.

Bom voltando as classes de fábrica quando você instancia qualquer entidade dessa forma você chama a seguinte função:

public static function getModel($modelClass = '', $arguments = array())
{
return self::getConfig()->getModelInstance($modelClass, $arguments)
}

Através do método getModelInstance ele passa os dois valores: o da classe e da entidade.

public function getModelInstance($modelClass='', $constructArguments=array())
{
$className = $this->getModelClassName($modelClass);
if (class_exists($className)) {
Varien_Profiler::start('CORE::create_object_of::'.$className);
$obj = new $className($constructArguments);
Varien_Profiler::stop('CORE::create_object_of::'.$className);
return $obj;
}
else
{
return false;
}
}public function getModelClassName($modelClass)
{
$modelClass = trim($modelClass);
if (strpos($modelClass, '/')===false) {
return $modelClass;
}
return $this->getGroupedClassName('model', $modelClass);
}

Como pode ver o getGroupedClassName () faz todo o trabalho ele explode nossa string usando ‘/’ como agulha, remove espaços em branco e as formas de matriz de strings.

Então, temos de invocar Varien_Simplexml_Element que recebe o nome da classe, no caso catálogo, que irá passar Mage_Catalog_Model, como foi declarado nas configurações dessa classe em seu arquivo config.xml

No caso desta extensão foi substituído, ela poderia ser Namespace_Catalog_Model. Nós também adicionamos o nome da entidade de classe (produto) e depois de usar Magento uc_words (baseado em PHP ucwords que retorna um string com o primeiro caractere de cada palavra maiúscula, se esse personagem é alfabética), que finalmente irá receber Mage_Catalog_Model_Product que será devolvido em getModelInstance. Como observamos de cima, ele irá criar o objeto, usando um novo operador.

Portanto para invocar Namespace_Modulename_Model devemos utilizar o comando

$model = Mage::getModel(‘modulename/model’);

Na criação de objetos de model, também podemos tentar usar Mage::getSingleton().

O método difere getModel() utilizando padrão de design diferente chamada Singleton, o que significa que somente uma instanciação de uma classe é utilizada durante o processo de execução.

No entanto, ao chamar getModel(), uma nova classe será criada toda vez que o método é chamado.

Ou seja, durante execução do código o getModel() cria uma classe nova e o getSingleton() somente o instancia.

No próximo post da sequência iremos falar sobre Helper que também são métodos de fábrica. Iremos ver como o Magento os instancia como vimos aqui com Models, aguarde!

2017-01-24T20:24:40+00:00

RECEBA DICAS VALIOSAS NO SEU EMAIL

x