Quelle serait la dernière meilleure pratique pour charger Order en utilisant l'incrément ID (au lieu de Order ID) en utilisant OrderRepository
Quelle serait la dernière meilleure pratique pour charger Order en utilisant l'incrément ID (au lieu de Order ID) en utilisant OrderRepository
Réponses:
Magento 2 utilise des contrats de service pour récupérer et enregistrer des objets. Dans Magento, cette couche est formée de référentiels, qui sont des gestionnaires get()
et des save()
méthodes. Cela éloigne le code utilisateur des appels du modèle. N'appelez pas les méthodes de modèle (comme load()
ou save()
ou loadByIncrementId()
) directement, elles sont obsolètes car le code personnalisé doit utiliser les contrats de service. De plus, n'utilisez pas l'API depuis Magento comme Khoa le suggère, cela n'a pas de sens. L'API permet de connecter Magento à d'autres systèmes.
Injectez OrderRepository et SearchCriteriaBuilder dans votre constructeur:
private $orderRepository;
private $searchCriteriaBuilder;
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Sales\Model\OrderRepository $orderRepository,
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
){
$this->orderRepository = $orderRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
parent::__construct($context);
}
Et dans votre fonction:
$searchCriteria = $this->searchCriteriaBuilder
->addFilter('increment_id', '000000001', 'eq')->create();
$orderList = $this->orderRepository->getList($searchCriteria)->getItems();
// $orderList is now an array of Orders with this incrementId, which is just one order obviously
/** @var \Magento\Sales\Model\Order $order */
$order = $orderList[0];
// Your logic here
$order = $this->orderRepository->save($order);
$order = $orderList[0]
par $order = $orderList->getFirstItem()
pour obtenir le premier (et le seul) élément de la collection.
$order = $orderList->getFirstItem(); $payment = $order->getPayment();
Mais n'obtiens rien $payment
Veuillez vérifier mon problème ici magento.stackexchange.com/questions/158935/…
$order = $orderList['000000001'];
Pour autant que je sache, nous devrions utiliser \Magento\Sales\Api\Data\OrderInterface
.
/** @var \Magento\Sales\Api\Data\OrderInterfaceFactory $order **/
protected $orderFactory;
public function __construct(
\Magento\Sales\Api\Data\OrderInterfaceFactory $orderFactory,
......
) {
$this->orderFactory = $orderFactory;
}
Charger l'objet de commande par ID d'incrément:
$this->orderFactory->create()->loadByIncrementId('00001952-42');
[EDIT] devrait essayer avec les contrats de service. Essayez la réponse de Jacco.
\Magento\Sales\Api\OrderRepositoryInterface
et sa get()
méthode