Magento 2: В чем разница между Create & Get ObjectManager?
У меня есть код ниже. Которые дают тот же результат, либо я использую create
, либо get
$orderId = 1;
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$this->orderPayment = $_objectManager->create('Magento\Sales\Api\Data\OrderPaymentInterface')->load($orderId);
$this->orderPayment = $_objectManager->get('Magento\Sales\Api\Data\OrderPaymentInterface')->load($orderId);
echo $this->orderPayment->getLastTransId();
Так в чем же именно разница между ними? Что нужно использовать и когда?
3
2 answers
- $_objectmanager->создать()создает новый экземпляр объекта, независимо от того, что
- $_objectmanager->get() сначала пытается найти общий экземпляр (уже созданный), если он не найден - он просто создает новый общий экземпляр
Если вы взглянете на класс Magento\Фреймворк\Менеджер объектов\Менеджер объектов, вы заметите этот блок:
...
/**
* Create new object instance
*
* @param string $type
* @param array $arguments
* @return mixed
*/
public function create($type, array $arguments = [])
{
$type = ltrim($type, '\\');
return $this->_factory->create($this->_config->getPreference($type), $arguments);
}
/**
* Retrieve cached object instance
*
* @param string $type
* @return mixed
*/
public function get($type)
{
$type = ltrim($type, '\\');
$type = $this->_config->getPreference($type);
if (!isset($this->_sharedInstances[$type])) {
$this->_sharedInstances[$type] = $this->_factory->create($type);
}
return $this->_sharedInstances[$type];
}
...
13
Author: Sinisa Nedeljkovic, 2017-09-28 06:45:19
Не используйте диспетчер объектов (плохая практика).
Вы должны пройти \Magento\Sales\Api\OrderRepositoryInterface
в конструкции вашего класса.
protected $order;
public function __construct(
...,
\Magento\Sales\Api\OrderRepositoryInterface $order
){
...
$this->order = $order;
}
Затем вы можете сделать следующее:
$order = $this->order->get($orderId);
echo $order->getPayment()->getLastTransId();
0
Author: Jonathan Ribas, 2017-03-13 08:52:20