Bagaimana instantiate model di magento2?

14

Apakah ada cara melakukan sesuatu yang sederhana seperti di magento2?

memanggil fungsi seperti ini di magento 2,

$model = Mage::getModel('cms/page');
Matoeil
sumber
pertanyaan tidak jelas letakkan lebih detail ....
Amit Bera

Jawaban:

28

Magento secara ketat mengecilkan penggunaan ObjectManager secara langsung. Ini menyediakan kelas layanan yang abstrak untuk semua skenario.

Untuk semua non-injeksi (model) Anda harus menggunakan pabrik:

$ pageFactory dilindungi;

fungsi publik __construct (\ Magento \ Cms \ Model \ PageFactory $ pageFactory)
{
    $ this-> pageFactory = $ pageFactory;
}

fungsi publik someFunc ()
{
    ...
    $ page = $ this-> pageFactory-> create ();
    ...
}

Yang harus Anda lakukan adalah meminta pabrik model yang diinginkan dalam konstruktor. Ini akan secara otomatis dihasilkan ketika Anda menjalankan Magento atau kompiler.

Anton Kril
sumber
11

Anda bisa melakukannya seperti ini:

$model = $this->_objectManager->create('Full\Model\Class\Name\Here');

tetapi Anda harus memastikan bahwa _objectManageranggota itu ada.

Di sebagian besar kelas seharusnya, tetapi jika tidak menyuntikkannya di konstruktor. Seperti ini:

protected $_objectManager;
public function __construct(
   ...,
   \Magento\Framework\ObjectManager $objectManager,
   ....
){
    ....
    $this->_objectManager= $objectManager;
    ....
}

[sunting satu tahun kemudian]
Bahkan jika jawaban di atas berfungsi, itu bukan praktik terbaik. Untuk cara yang benar melakukannya lihat jawaban Anton.

Marius
sumber
mendapat kesalahan - Kelas Magento \ Framework \ ObjectManager tidak ada
Anas Mansuri
5

Secara teknis jika Anda memiliki sebuah instance dari \Magento\Framework\ObjectManagerAnda dapat memanggil createdari getdan ini akan memberikan objek yang Anda inginkan. Tapi itu benar-benar tergantung pada di mana Anda ingin menggunakan ini karena Magento 2 bergeser ke injeksi ketergantungan melalui konstruktor .

David Manners
sumber