As características realmente funcionam com injeção de dependência no Magento? Considere o seguinte código:
Classe de Características
namespace Frame\Slick\Block;
use Frame\Slider\Slick\Block\Data as Helper
trait Slick
{
protected $_slickHelper;
public function __construct(Helper $slickHelper)
{
$this->_slickHelper = $slickHelper;
}
}
Classe usando a característica
namespace Frame\Slick\Block;
class Product ListProduct implements BlockInterface
{
use Slick;
public function testTrait()
{
return $this->_slickHelper->getHelloWorld();
}
}
Parece sempre retornar nulo, tenho certeza de que tudo está sendo incluído corretamente. A característica pode realmente suportar a injeção de dependência?
EDIT: Por exemplo, se você fizer um di no construtor de características e atribuí-lo a uma variável de característica e depois a chamar na classe que usa a característica, ela sempre retornará nulo. Qualquer outra coisa funciona bem.
Respostas:
Eu testei usando característica e funciona bem.
Aqui está a aparência da minha característica:
Eu o uso no controlador assim:
E aqui está o resultado:
fonte
Eu só estava enfrentando isso. A postagem original é bem antiga, então as coisas podem ser diferentes agora do que quando foi postada, no entanto, o que descobri é que o construtor DI funciona, mas tem uma grande ressalva.
Se eu usar a seguinte característica no meu código:
e prossiga para usar essa característica em uma classe:
A interface do logger é injetada perfeitamente e tudo funciona bem. No entanto, se eu quiser injetar minhas próprias classes na minha classe Service usando o método construtor. Por exemplo:
Nesse caso, o método construtor da minha característica nunca é chamado, o que significa que a propriedade $ logger da minha classe nunca é definida. É certo que eu não usei muito os traços, por isso meu conhecimento é meio limitado, mas minha suposição é que isso ocorre porque minha classe substituiu o método construtor do meu traço. Isso é praticamente uma rolha de exibição, já que a maior parte da base de código Magento usa construtores para injetar dependências, descartando afetivamente seu uso em características.
A única solução real que posso ver é usar o ObjectManager diretamente para injetar suas dependências de características:
Isenção de responsabilidade: O uso do ObjectManager no Magento geralmente é desencorajado, mas pelo que posso ver neste caso, é a única opção real. No meu exemplo, se você quiser definir uma interface de logger diferente em sua classe, ainda poderá fazê-lo injetando-a em seu construtor e substituindo a propriedade $ logger das classes.
fonte
__construct
, que é um importado do traço e o outro na própria classe. No entanto, você não pode ter 2 métodos com o mesmo nome na classe única. Então, basicamente, no seu caso,__construct
a característica é substituída pela__construct
própria classe.