Les traits fonctionnent-ils réellement avec l'injection de dépendance dans Magento? Considérez le code suivant:
Classe de caractère
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 utilisant le trait
namespace Frame\Slick\Block;
class Product ListProduct implements BlockInterface
{
use Slick;
public function testTrait()
{
return $this->_slickHelper->getHelloWorld();
}
}
Cela semble toujours retourner null, je suis très sûr que tout est correctement inclus. Le trait peut-il vraiment soutenir l'injection de dépendance?
EDIT: Par exemple, si vous faites un di dans le constructeur de trait et l'assignez à une variable de trait et que vous l'appelez ensuite sur la classe qui utilise le trait, il retournera toujours null. Tout le reste fonctionne bien.
Réponses:
J'ai testé en utilisant trait et cela fonctionne très bien.
Voici à quoi ressemble mon trait:
Je l'utilise dans un contrôleur comme celui-ci:
Et voici le résultat:
la source
J'étais juste face à ça moi-même. Le message d'origine est assez ancien, donc les choses peuvent être différentes maintenant que lorsqu'il a été publié, mais ce que j'ai trouvé, c'est que le constructeur DI fonctionne, mais il a une mise en garde assez importante.
Si j'utilise le trait suivant dans mon code:
puis continuez à utiliser ce trait dans une classe:
L'interface de l'enregistreur est parfaitement injectée et tout fonctionne bien. CEPENDANT, si je veux injecter mes propres classes dans ma classe Service en utilisant la méthode constructeur. Par exemple:
Dans ce cas, la méthode constructeur de ma caractéristique n'est jamais appelée, ce qui signifie que la propriété $ logger de ma classe n'est jamais définie. Certes, je n'ai pas beaucoup utilisé les traits, donc mes connaissances sont assez limitées, mais je suppose que c'est parce que ma classe a outrepassé la méthode constructeur de mon trait. C'est à peu près un bouchon de show car la plupart de la base de code Magento utilise des constructeurs pour injecter des dépendances, excluant affectivement leur utilisation dans les traits.
La seule vraie solution que je puisse voir est d'utiliser directement l'ObjectManager pour injecter vos dépendances de traits:
Avertissement: L'utilisation d'ObjectManager dans Magento est généralement déconseillée mais d'après ce que je peux voir dans ce cas, c'est la seule véritable option. Dans mon exemple, si vous souhaitez définir une autre interface de journalisation dans votre classe, vous pouvez toujours le faire en l'injectant dans votre constructeur et en remplaçant la propriété classes $ logger.
la source
__construct
, qui est l'un importé de trait et l'autre dans la classe elle-même. Cependant, vous ne pouvez pas avoir 2 méthodes avec le même nom dans une seule classe. Donc, fondamentalement, dans votre cas,__construct
le trait est remplacé par__construct
dans la classe elle-même.