Vejo que você veio à solução certa, só quero resumir.
A injeção de construtor deve ser usada para recuperar o auxiliar (ou qualquer outra instância) em qualquer classe que você precisar:
class SomeClass
{
public function __construct(\Magento\Core\Helper\Data $helper)
{
$this->helper = $helper;
}
public function doSmth()
{
$this->helper->someMethod();
}
}
Observe que nenhum comentário do phpDoc é necessário , o Magento lerá a assinatura do construtor diretamente para descobrir quais dependências são necessárias.
\ Magento \ Core \ Helper \ Factory deve ser usado apenas em casos raros, quando você precisar chamar muitos auxiliares ou não souber exatamente qual deles precisa.
O uso do Object Manager diretamente é estritamente desencorajado . Portanto, evite usar:
\Magento\Core\Model\ObjectManager::getInstance()
Está lá apenas para serialização / desserialização.
helper
no modelo, como$this->helper('Magento\Catalog\Helper\Image')
, segue as melhores práticas?Parece que o pessoal do Magento usa seu novo sistema de injeção automática de dependências para levar ajudantes e modelos para objetos através do construtor do objeto.
A versão curta? Se você tiver um objeto instanciado pelo gerenciador de objetos
e decorar um construtor com um PHPDoc, e os parâmetros tiverem uma dica de tipo adequada, o gerenciador de objetos instanciará automaticamente o auxiliar (ou, acredito, outros objetos) para você.@param
Por exemplo, o construtor a seguir injeta um auxiliar de dados principais no objeto.
fonte
Além de todas as respostas acima, se você precisar usar o helper no modelo phtml, poderá simplesmente fazer o seguinte:
Espero que seja útil se alguém não soubesse antes;)
fonte
A maneira como os auxiliares são instanciados (pelo menos para o novo módulo Back-end (~ dev50)) é por meio de um helperFactory:
Que é essencialmente apenas um tipo especializado de uma fábrica de modelos. Por exemplo: Magento \ Core \ Block \ Context linha 143 (dev50) como parte do construtor:
A fábrica auxiliar ajudará o modelo solicitado com base no nome da classe e garantirá que seja uma
instanceof
classe abstrata auxiliar:Se você implementou isso sozinho , parece que o núcleo do Magento está carregando de uma de duas maneiras:
Role sua própria fábrica:
Ou simplesmente pegue-o diretamente:
fonte
get
?Tente desta maneira
fonte