Como instanciar um modelo no magento2?

14

Existe uma maneira de fazer algo simples como no magento2?

função de chamada como esta no magento 2,

$model = Mage::getModel('cms/page');
Matoeil
fonte
questão não é clara colocar mais detalhes ....
Amit Bera

Respostas:

28

O Magento desencoraja estritamente o uso do ObjectManager diretamente. Ele fornece classes de serviço que o abstraem para todos os cenários.

Para todos os não injetáveis ​​(modelos), é necessário usar a fábrica:

protected $ pageFactory;

função pública __construct (\ Magento \ Cms \ Model \ PageFactory $ pageFactory)
{
    $ this-> pageFactory = $ pageFactory;
}

função pública someFunc ()
{
    ...
    $ page = $ this-> pageFactory-> create ();
    ...
}

Tudo o que você precisa fazer é solicitar a fábrica do modelo desejado no construtor. Ele será gerado automaticamente quando você executar o Magento ou o compilador.

Anton Kril
fonte
11

Você pode fazer assim:

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

mas você precisa garantir que o _objectManagermembro exista.

Na maioria das classes, deveria, mas se não injetar no construtor. Como isso:

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

[editar um ano depois]
Mesmo que a resposta acima funcione, não é a melhor prática. Para o caminho certo, veja a resposta de Anton.

Marius
fonte
obteve o erro - não Classe Magento \ Framework \ ObjectManager não existe
Anas Mansuri
5

Tecnicamente, se você tiver uma instância do \Magento\Framework\ObjectManagerque você pode chamar createde gete isso vai dar-lhe o objeto que você deseja. Mas isso realmente depende de onde você deseja usar isso, pois o Magento 2 muda para injeção de dependência via construtor .

David Manners
fonte