Как модулю выполнить некую инициализацию перед запуском Magento

модуль

(Дмитрий Федюк) #1

Я в своих модулях для Magento 2 перед запуском Magento загружаю свои мини-библиотеки, интерфейс которых доступен не в стандартном виде классов, а виде глобальных функций с короткими именами (пример: rm_customer_logged_in()).

<type name='\Magento\Framework\AppInterface'>
	<plugin
		name='Df\Framework\AppInterfacePlugin'
		type='Df\Framework\AppInterfacePlugin'
		sortOrder='100'
	/>
</type>
<?php
namespace Df\Framework;
use \Magento\Framework\AppInterface;
class AppInterfacePlugin {
	/**
	 * @see \Magento\Framework\AppInterface::launch()
	 * @param AppInterface $subject
	 * @return array
	 */
	public function beforeLaunch(AppInterface $subject) {
		// Place your custom initialization code here.
		return [];
	}
}


(Дмитрий Федюк) #2

Такая инициализация не работает для консольных приложений (например, setup:upgrade).
Для консольных приложений я использую подписку на события:

<event name='store_collection_load_before'>
	<observer
		name='Df\Core\Boot'
		instance='Df\Core\Boot'
		method='storeCollectionLoadBefore'
	/>
</event>
<?php
namespace Df\Core;
use \Magento\Framework\Event\Invoker\InvokerDefault;
use \Magento\Framework\Event\Observer as _O;
class Boot {
	/**
	 * @used-by InvokerDefault::_callObserverMethod()
	 * @param _O $o
	 * @return void
	 */
	public function storeCollectionLoadBefore(_O $o) {
		if (!self::$_done && 'cli' === PHP_SAPI) {
			self::run();
		}
	}
	// other code here...
}

(Дмитрий Федюк) #3

С октября 2015 года порядок подписки на события и обработки событий в Magento 2 изменились: Как в Magento 2 подписаться на событие и обработать его