С октября 2015 года порядок подписки на события и обработки событий изменились:
Шаг1
Объявите обработчики событий в файле events.xml модуля.
У модуля может быть несколько файлов events.xml:
| Расположение | В каких случаях будут задействованы объявленные в файле обработчики событий | Пример из ядра | 
|---|---|---|
| `etc/events.xml` | Всегда. | [`Magento/CatalogInventory`][1] | 
| `etc/adminhtml/events.xml` | Только в административном интерфейсе. | [`Magento/Catalog`][2] | 
| `etc/frontend/events.xml` | Только на витрине. | [`Magento/Catalog`][3] | 
| `etc/crontab/events.xml` | Только при выполнении задач планировщиком ([cron][4]). | [`Magento/CatalogRule`][5] | 
| `etc/setup/events.xml` | Только при [установке][6] и [обновлении][7] Magento и модулей. | [`Magento/CatalogUrlRewrite`][8] | 
| `etc/webapi_rest/events.xml` | Только при обработке запросов по протоколу [REST][9] [API][10]. | [`Magento/CatalogRule`][11] | 
| `etc/webapi_soap/events.xml` | Только при обработке запросов по протоколу [SOAP][12] [API][13]. | [`Magento/CatalogRule`][14] | 
Пример описания обработчика события в файле events.xml:
<?xml version='1.0'?>
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd'>
	<event name='controller_action_predispatch'>
		<observer
			name='Df\Core\Observer\ControllerActionPredispatch'
			instance='Df\Core\Observer\ControllerActionPredispatch'
		/>
	</event>
</config>
Step 2
Пример класса-обработчика собатия.
Класс должен реализовывать интерфейм \Magento\Framework\Event\ObserverInterface.
Этот интерфейс состоит из единственного метода execute, и этот метод должен быть реализован, например:
<?php
namespace Df\Core\Observer;
use Magento\Framework\Event\ObserverInterface;
class ControllerActionPredispatch implements ObserverInterface {
	/**
	 * @override
	 * @see ObserverInterface::execute()
	 * @used-by \Magento\Framework\Event\Invoker\InvokerDefault::_callObserverMethod()
	 * @see \Magento\Framework\App\Action\Action::dispatch()
	 * https://github.com/magento/magento2/blob/dd47569249206b217e0a9f9a9371e73fd7622724/lib/internal/Magento/Framework/App/Action/Action.php#L91-L92
		$eventParameters = ['controller_action' => $this, 'request' => $request];
		$this->_eventManager->dispatch('controller_action_predispatch', $eventParameters)
	 * @param \Magento\Framework\Event\Observer $observer
	 * @return void
	 */
	public function execute(\Magento\Framework\Event\Observer $observer) {
		rm_state()->controllerSet($observer['controller_action']);
	}
}