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();

Так в чем же именно разница между ними? Что нужно использовать и когда?

Author: Jackson, 2017-03-13

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