Работают ли черты с внедрением зависимостей в Magento? Рассмотрим следующий код:
Черта Класс
namespace Frame\Slick\Block;
use Frame\Slider\Slick\Block\Data as Helper
trait Slick
{
protected $_slickHelper;
public function __construct(Helper $slickHelper)
{
$this->_slickHelper = $slickHelper;
}
}
Класс, использующий черту
namespace Frame\Slick\Block;
class Product ListProduct implements BlockInterface
{
use Slick;
public function testTrait()
{
return $this->_slickHelper->getHelloWorld();
}
}
Кажется, это всегда возвращает ноль, я уверен, что все включено правильно. Может ли черта действительно поддерживать внедрение зависимостей?
РЕДАКТИРОВАТЬ: Например, если вы сделаете di в конструкторе признака и присвоите его переменной признака, а затем вызовете его в классе, который использует признак, он всегда будет возвращать ноль. Все остальное работает нормально.
Ответы:
Я проверил, используя черту, и она отлично работает.
Вот как выглядит моя черта:
Я использую это в контроллере, как это:
И вот результат:
источник
Я просто столкнулся с этим сам. Исходное сообщение довольно старое, так что теперь все может отличаться от того, когда оно было опубликовано, однако я обнаружил, что конструктор DI работает, но у него довольно большое предостережение.
Если я использую следующую черту в моем коде:
а затем перейдите к использованию этой черты в классе:
Интерфейс логгера вводится отлично и все работает отлично. ОДНАКО, если я хочу внедрить свои собственные классы в мой класс Service, используя метод конструктора. Например:
В этом случае метод конструктора моей черты никогда не вызывается, то есть свойство $ logger моего класса никогда не устанавливается. По общему признанию, я не использовал черты, поэтому мои знания ограничены, но я предполагаю, что это потому, что мой класс переопределил метод конструктора моей черты. Это в значительной степени ограничитель показа, так как большая часть кода Magento использует конструкторы для введения зависимостей, аффективно исключая их использование в чертах.
Единственное реальное решение, которое я вижу, - это использовать ObjectManager напрямую, чтобы ввести зависимости от вас:
Отказ от ответственности: использование ObjectManager в Magento, как правило, не рекомендуется, но из того, что я вижу в этом случае, это единственный реальный вариант. В моем примере, если вы хотите установить другой интерфейс логгера в своем классе, вы все равно можете сделать это, внедрив его в конструктор и переопределив свойство классов $ logger.
источник
__construct
, один из которых импортирован из черты, а другой в самом классе. Однако вы не можете иметь 2 метода с одинаковым именем в одном классе. Так что в основном в вашем случае__construct
эта черта переопределяется самим__construct
классом.