Saya hanya menghadapi ini sendiri. Posting asli cukup tua sehingga hal-hal mungkin berbeda sekarang daripada ketika diposting, namun yang saya temukan adalah bahwa konstruktor DI berfungsi tetapi memiliki peringatan yang cukup besar.
Jika saya menggunakan Ciri berikut dalam kode saya:
<?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;
}
}
dan kemudian lanjutkan untuk menggunakan sifat itu di kelas:
<?php
namespace My\Module;
use \My\Module\Util\LoggerTrait;
class Service
{
use LoggerTrait;
public function doSomething() {
$this->getLogger()->log('Something was done!');
}
}
Antarmuka logger disuntikkan dengan sempurna dan semuanya berfungsi dengan baik. NAMUN, jika saya ingin menyuntikkan kelas saya sendiri ke kelas Layanan saya menggunakan metode konstruktor. Misalnya:
<?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!');
}
}
Dalam hal ini metode konstruktor sifat saya tidak pernah dipanggil, artinya properti $ logger dari kelas saya tidak pernah disetel. Memang saya belum banyak menggunakan sifat sehingga pengetahuan saya agak terbatas, tetapi asumsi saya adalah ini karena kelas saya telah menimpa metode konstruktor sifat saya. Ini cukup banyak sebagai penghenti acara karena sebagian besar basis kode Magento menggunakan konstruktor untuk menyuntikkan ketergantungan, secara efektif mengesampingkan penggunaannya dalam sifat.
Satu-satunya solusi nyata yang bisa saya lihat adalah dengan menggunakan ObjectManager secara langsung untuk menyuntikkan ketergantungan sifat Anda:
<?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;
}
}
Penafian: Penggunaan ObjectManager di Magento pada umumnya tidak disarankan tetapi dari apa yang saya lihat dalam kasus ini adalah satu-satunya pilihan nyata. Dalam contoh saya jika Anda ingin mengatur antarmuka logger yang berbeda di kelas Anda, Anda masih bisa melakukannya dengan menyuntikkannya di konstruktor Anda dan menimpa properti $ logger kelas.