¿Los rasgos realmente funcionan con la inyección de dependencia en Magento? Considere el siguiente código:
Clase de rasgo
namespace Frame\Slick\Block;
use Frame\Slider\Slick\Block\Data as Helper
trait Slick
{
protected $_slickHelper;
public function __construct(Helper $slickHelper)
{
$this->_slickHelper = $slickHelper;
}
}
Clase usando el rasgo
namespace Frame\Slick\Block;
class Product ListProduct implements BlockInterface
{
use Slick;
public function testTrait()
{
return $this->_slickHelper->getHelloWorld();
}
}
Parece que esto siempre devuelve nulo, estoy muy seguro de que todo se incluye correctamente. ¿Puede el rasgo realmente apoyar la inyección de dependencia?
EDITAR: Por ejemplo, si hace un di en el constructor de rasgos y lo asigna a una variable de rasgo y luego lo llama a la clase que usa el rasgo, siempre devolverá nulo. Cualquier otra cosa funciona bien.
Respuestas:
He probado usando rasgo y funciona bien.
Así es como se ve mi rasgo:
Lo uso en un controlador como este:
Y aqui esta el resultado:
fuente
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:
y luego proceder a usar ese rasgo en una clase:
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:
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:
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.
fuente
__construct
, que es uno importado del rasgo y el otro en la clase misma. Sin embargo, no puede tener 2 métodos con el mismo nombre en una sola clase. Básicamente, en su caso,__construct
el rasgo se anula__construct
en la clase misma.