Estaba enfrentando esto yo mismo. La publicación original es bastante antigua, por lo que las cosas pueden ser diferentes ahora que cuando se publicó, sin embargo, lo que encontré es que el constructor DI funciona pero tiene una advertencia bastante grande.
Si uso el siguiente rasgo en mi código:
<?php
namespace My\Module\Util;
use Psr\Log\LoggerInterface;
trait LoggerTrait
{
protected $logger;
public function __construct(
LoggerInterface $logger
) {
$this->logger = $logger;
}
/**
* @return Logger
*/
public function getLogger()
{
return $this->logger;
}
/**
* @param Logger $logger
*/
public function setLogger($logger)
{
$this->logger = $logger;
}
}
y luego proceder a usar ese rasgo en una clase:
<?php
namespace My\Module;
use \My\Module\Util\LoggerTrait;
class Service
{
use LoggerTrait;
public function doSomething() {
$this->getLogger()->log('Something was done!');
}
}
La interfaz del registrador se inyecta perfectamente y todo funciona bien. SIN EMBARGO, si quiero inyectar mis propias clases en mi clase de Servicio utilizando el método constructor. P.ej:
<?php
namespace My\Module;
use \My\Module\Util\LoggerTrait;
class Service
{
use LoggerTrait;
public function __construct(
\Some\Other\Class $class
) {
$this->other = $class;
}
public function doSomething() {
$this->getLogger()->log('Something was done!');
}
}
En este caso, nunca se llama al método constructor de mi rasgo, lo que significa que la propiedad $ logger de mi clase nunca se establece. Es cierto que no he usado muchos rasgos, así que mi conocimiento es un poco limitado, pero supongo que esto se debe a que mi clase ha anulado el método del constructor de mi rasgo. Esto es más o menos un espectáculo, ya que la mayoría de la base de código de Magento usa constructores para inyectar dependencias, descartando afectivamente su uso en rasgos.
La única solución real que puedo ver es usar ObjectManager directamente para inyectar sus dependencias de rasgos:
<?php
namespace My\Module\Util;
use Psr\Log\LoggerInterface;
trait LoggerTrait
{
protected $logger;
/**
* @return Logger
*/
public function getLogger()
{
if (is_null($this->logger)) {
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$this->logger = $objectManager->create('Psr\Log\LoggerInterface');
}
return $this->logger;
}
/**
* @param Logger $logger
*/
public function setLogger($logger)
{
$this->logger = $logger;
}
}
Descargo de responsabilidad: el uso de ObjectManager en Magento generalmente se desaconseja, pero por lo que puedo ver en este caso, es la única opción real. En mi ejemplo, si desea establecer una interfaz de registrador diferente en su clase, aún puede hacerlo inyectándola en su constructor y anulando la propiedad de clases $ logger.