EventManagerTrait¶
Published: 2019-12-21
Author: Nickolas Burr
Description¶
Magento provides an event-driven subsystem that allows modules to dispatch and observe arbitrary types of events. This is useful for a variety of reasons, such as:
Performing actions upon occurrence of specific events
Receiving important data sent by an event dispatcher
Logging state during time of event dispatch
In the example below, we’ve created a trait called EventManagerTrait. By mixing in the
EventManagerTrait trait, a class can easily dispatch events with data by invoking the
dispatchEvent method.
Usage¶
<?php
/**
 * Entity.php
 */
declare(strict_types=1);
namespace Vendor\Package\Model;
use Magento\Framework\Event\ManagerInterface as EventManagerInterface;
use Vendor\Package\Component\Event\EventManagerTrait;
class Entity
{
    /**
     * @property EventManagerInterface $eventManager
     * @method void dispatchEvent(string $event, array $data)
     */
    use EventManagerTrait;
    /**
     * @param EventManagerInterface $eventManager
     * @return void
     */
    public function __construct(
        EventManagerInterface $eventManager
    ) {
        $this->eventManager = $eventManager;
    }
    /**
     * @return void
     */
    public function save()
    {
        $this->dispatchEvent(
            'package_entity_save_before',
            [
                'entity' => $entity,
                'status' => $status,
            ]
        );
        ...
        $this->dispatchEvent(
            'package_entity_save_after',
            [
                'entity' => $entity,
                'status' => $status,
            ]
        );
    }
}
Source¶
<?php
/**
 * EventManagerTrait.php
 */
declare(strict_types=1);
namespace Vendor\Package\Component\Event;
trait EventManagerTrait
{
    /** @property Magento\Framework\Event\ManagerInterface $eventManager */
    private $eventManager;
    /**
     * @param string $event
     * @param array $data
     * @return void
     */
    private function dispatchEvent(string $event, array $data = []): void
    {
        $this->eventManager
            ->dispatch($event, $data);
    }
}