X

Magento 2: Как протестировать observer (вызвать event)?

Столкнулся с тем, что понадобилось протестировать observer для модуля PayPal в Magento 2. Настраивать песочницу, а тем более дергать реальные методы совсем не хотелось, поэтому решил дернуть нужный мне event напрямую..

Итак, навешиваем observer в своем модуле, так как описано в мануале на оф сайте

в файл app/code/Company/Support/etc/events.xml добавляем нужныое событие

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="paypal_express_place_order_success">
        <observer name="PaypalExpressPlaceOrderSuccessLogger"
                  instance="Company\Support\Observer\PaypalExpressPlaceOrderSuccessLogger"
                  disabled="false"/>
    </event>
</config>

затем создаем сам обработчик app/code/Ewave/Support/Observer/PaypalExpressPlaceOrderSuccessLogger.php

<?php

namespace Ewave\Support\Observer;

use Magento\Framework\Event\ObserverInterface;

class PaypalExpressPlaceOrderSuccessLogger implements ObserverInterface
{
    /**
     * PaypalExpressPlaceOrderSuccessLogger constructor.
     */    public function __construct() {
        // тут конструктор и объекты которые надо создать для работы
    }

    /**
     * @param \Magento\Framework\Event\Observer $observer
     * @return bool|void
     * @throws \Magento\Framework\Exception\LocalizedException
     */    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        /** @var \Magento\Sales\Model\Order $order */        $order = $observer->getData('order');

        /** @var \Magento\Quote\Model\Quote $quote */        $quote = $observer->getData('quote');

        if (!$order || !$quote) {
            return false;
        }


        // тут остальная логика
    }
}

и вот теперь наш обработчик готов, надо его как-то протестировать сделать это можно создав файл в корне, например test-paypal.php с таким содержимым

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('memory_limit', '5G');
error_reporting(E_ALL);

require 'app/bootstrap.php';

$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);

$objectManager = $bootstrap->getObjectManager();

/** @var  $state \Magento\Framework\App\State */
$state = $objectManager->get(\Magento\Framework\App\State::class);
$state->setAreaCode(\Magento\Framework\App\Area::AREA_GLOBAL);

/** @var $order \Magento\Sales\Model\OrderRepository */$orderRepository = $objectManager->create(\Magento\Sales\Model\OrderRepository::class);
$order = $orderRepository->get(942195); // нужный ордер

/** @var $quote \Magento\Quote\Model\QuoteRepository */$quoteRepository = $objectManager->create(\Magento\Quote\Model\QuoteRepository::class);
$quote = $quoteRepository->get(3529710); // нужная квота

$eventManager = $objectManager->create(\Magento\Framework\Event\Manager::class);

// вызываем нужный эвент
$eventManager->dispatch(
    'paypal_express_place_order_success',
    [
        'order' => $order,
        'quote' => $quote
    ]
);

сам вызов эвента, нужно найти в коде и передать ему такие же параметры, например используемый мной находится в файле vendor/magento/module-paypal/Controller/Express/AbstractExpress/PlaceOrder.php в методе execute

   public function execute()
    {
 ...

            $this->_eventManager->dispatch(
                'paypal_express_place_order_success',
                [
                    'order' => $order,
                    'quote' => $this->_getQuote()
                ]
            );
...
    }

После создания файла для запуска тестов, его можно вызывать из консоли

php test-paypal.php

Таким образом, вы можете протестировать ваш observer до того, как запускать его в работающем окружении.

Категории: Magento
Тэги: eventm2observer