Magento 2: Как использовать инъекцию конструктора в Contoller


У меня есть следующий код контроллера, который отлично работает с помощью диспетчера объектов. Как я могу использовать для этого инъекцию конструктора вместо диспетчера объектов?

namespace Amit\Qr\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
/** @var \Magento\Framework\View\Result\PageFactory  */

    protected $resultPageFactory;
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory

    ) {
        $this->resultPageFactory = $resultPageFactory;

        parent::__construct($context);
    }

    public function execute()
    {
        $orderId = $this->getRequest()->getParam('order_id');
        $order = $this->_objectManager->create('Magento\Sales\Model\Order');
        $order->load($orderId);
        $customerId = $order->getCustomerId();
        echo $customerId;
        //.....
   }
}
Author: amitshree, 2016-03-19

2 answers

Просто переместите все зависимости в конструктор

class Index extends \Magento\Framework\App\Action\Action
{
    /** @var \Magento\Framework\View\Result\PageFactory  */
    protected $resultPageFactory;
    private $orderFactory;
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Sales\Model\OrderFactory $orderFactory

    ) {
        $this->resultPageFactory = $resultPageFactory;
        $this->orderFactory = $orderFactory;
        parent::__construct($context);
    }

    public function execute()
    {
        $orderId = $this->getRequest()->getParam('order_id');
        $order = $this->orderFactory->create();
        $order->load($orderId);
        $customerId = $order->getCustomerId();
        echo $customerId;
        //.....
   }
}

Следующим шагом будет использование сервисов:

class Index extends \Magento\Framework\App\Action\Action
{
    /** @var \Magento\Framework\View\Result\PageFactory  */
    protected $resultPageFactory;
    /** @var \Magento\Sales\Model\OrderRepository */
    private $orderRepository;

    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Sales\Model\OrderRepository $orderRepository

    ) {
        $this->resultPageFactory = $resultPageFactory;
        $this->orderRepository = $orderRepository;
        parent::__construct($context);
    }

    public function execute()
    {
        $orderId = $this->getRequest()->getParam('order_id');
        $order = $this->orderRepository->get($orderId);
        $customerId = $order->getCustomerId();
        echo $customerId;
        //.....
   }
}
 5
Author: KAndy, 2016-03-20 07:50:10

Вы должны ввести порядок моделей по Фабрикам

public function __construct(
    \Magento\Framework\App\Action\Context $context,
    \Magento\Sales\Model\OrderFactory $orderFactory
    .....another injection......
) {
    $this->orderFactory = $orderFactory;
    ....
    parent::__construct($context);
}


public function execute() {
     $order = $this->orderFactory->create(); // Use Factory to create instance order model object
}

Старайтесь избегать прямого использования _objectManager, насколько это возможно

 2
Author: mrtuvn, 2016-03-20 08:01:13