Apakah ciri-ciri sebenarnya berfungsi dengan injeksi ketergantungan pada Magento? Pertimbangkan kode berikut:
Kelas Sifat
namespace Frame\Slick\Block;
use Frame\Slider\Slick\Block\Data as Helper
trait Slick
{
protected $_slickHelper;
public function __construct(Helper $slickHelper)
{
$this->_slickHelper = $slickHelper;
}
}
Kelas menggunakan sifat tersebut
namespace Frame\Slick\Block;
class Product ListProduct implements BlockInterface
{
use Slick;
public function testTrait()
{
return $this->_slickHelper->getHelloWorld();
}
}
Ini sepertinya selalu mengembalikan nol, saya yakin semuanya dimasukkan dengan benar. Bisakah sifat benar-benar mendukung injeksi ketergantungan?
EDIT: Sebagai contoh jika Anda melakukan suatu di di trait constructor dan menugaskannya ke variabel trait dan kemudian memanggilnya pada kelas yang menggunakan trait, ia akan selalu mengembalikan null. Ada lagi yang berfungsi dengan baik.
Jawaban:
Saya telah diuji menggunakan sifat dan itu berfungsi dengan baik.
Ini adalah sifat saya:
Saya menggunakannya dalam controller seperti ini:
Dan inilah hasilnya:
sumber
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:
dan kemudian lanjutkan untuk menggunakan sifat itu di kelas:
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:
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:
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.
sumber
__construct
, yang satu diimpor dari sifat, dan yang lainnya di kelas itu sendiri. Namun, Anda tidak dapat memiliki 2 metode dengan nama yang sama di kelas tunggal. Jadi pada dasarnya dalam kasus Anda,__construct
sifat itu ditimpa oleh__construct
di dalam kelas itu sendiri.