Magento 2: uso adequado de ajudantes

9

Estou começando a ver mais e mais pessoas declarando classes auxiliares para poder usar o seguinte nos arquivos de modelo:

$this->helper('Path/To/Helper/Class')->customMethod();

Esse tipo de código permite que as pessoas evitem a restrição direta de não usar o gerenciador de objetos, mas eu costumo ver o código que deve ser um código de bloco nesses auxiliares.

Então, aqui estão as minhas questões:

  • o que se deve escrever nas classes auxiliares?
  • em quais casos é relevante usar métodos auxiliares nos modelos?
Raphael na Digital Pianism
fonte

Respostas:

20

Não.
É como usar ObjectManager::getInstance()->create()um modelo!
Use um bloco personalizado que receba o auxiliar como uma dependência do construtor e adicione um método proxy que chame o método auxiliar.

No modelo:

$block->customMethod()

No bloco:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

No princípio da POO, isso evita violar a "Lei de Demeter". Ele encapsula a lógica de negócios no bloco em vez do modelo. Como efeito colateral, também torna a lógica mais testável à medida que a lógica é movida para o bloco.

Com relação à lógica colocada nas classes auxiliares, acho que no Magento 2 os auxiliares fazem mais sentido para os serviços, como algo que não é um modelo, mas contém código reutilizável, por exemplo, formatação de preço (que está contida no núcleo, mas eu posso pense em um exemplo melhor agora).

Vinai
fonte
Eu concordo com o princípio, no entanto, parece que usando a preferência no di.xmltipo de classe de blocos, não mantenha alguma configuração de layout. Tentei, por exemplo, fazer isso para a classe \Magento\Catalog\Block\Product\View\Type\Simple, o modelo default.phtmlusado em nosso modelo é ignorado. Nenhuma pista do porquê no momento
Sylvain Rayé 24/05
2
Pulando aqui para obter informações mais atualizadas. A partir da versão 2.2, a extensão de classes de bloco não é recomendada. Em vez disso, se a lógica de apresentação personalizada for necessária, um ViewModel deve ser definido e declarado como um argumento para o Bloco no layout.xml. Desde ViewModels são construídos através do Gerenciador de objeto, você pode conectar o seu próprio gráfico de dependência, sem expor-se a alterações significativas BC em versões futuras do Magento 2.
John Hall
1

Vejo auxiliares como funções globais dentro do seu módulo (desculpe pela palavra 'global') e gerentes / contratos de serviço como funções globais que podem ser usadas tanto dentro como fora do módulo.

Se você seguir esse princípio, verá que há um uso mínimo para auxiliares, eu os uso apenas como wrapper de configuração em meus módulos.

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

Esse tipo de coisa. Se você tiver qualquer outra funcionalidade que possa ser prática fora do seu módulo, crie um gerente.

Em um mundo ideal, os desenvolvedores de terceiros que precisam da funcionalidade de outros módulos devem ter apenas que procurar nas interfaces disponíveis repositórios e gerenciadores e outras coisas na Apipasta -folder.

Giel Berkers
fonte