namespace Civi\Core;
-use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
+use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
/**
*
* @see \CRM_Utils_Hook
*/
-class CiviEventDispatcher extends ContainerAwareEventDispatcher {
+class CiviEventDispatcher extends EventDispatcher {
const DEFAULT_HOOK_PRIORITY = -100;
*/
protected function bindPatterns($eventName) {
if ($eventName !== NULL && !isset($this->autoListeners[$eventName])) {
+ $this->lazyLoad($eventName);
$this->autoListeners[$eventName] = 1;
if ($this->isHookEvent($eventName)) {
// WISHLIST: For native extensions (and possibly D6/D7/D8/BD), enumerate
], self::DEFAULT_HOOK_PRIORITY);
}
}
+ elseif (NULL === $eventName) {
+ foreach ($this->listenerIds as $serviceEventName => $args) {
+ $this->lazyLoad($serviceEventName);
+ }
+ }
}
/**
return 'fail';
}
+ public function addListenerService($eventName, $callback, $priority = 0) {
+ if (!\is_array($callback) || 2 !== \count($callback)) {
+ throw new \InvalidArgumentException('Expected an array("service", "method") argument');
+ }
+ $this->listenerIds[$eventName][] = array(
+ $callback[0],
+ $callback[1],
+ $priority,
+ );
+ }
+
+ public function addSubscriberService($serviceId, $class) {
+ foreach ($class::getSubscribedEvents() as $eventName => $params) {
+ if (\is_string($params)) {
+ $this->listenerIds[$eventName][] = array(
+ $serviceId,
+ $params,
+ 0,
+ );
+ }
+ elseif (\is_string($params[0])) {
+ $this->listenerIds[$eventName][] = array(
+ $serviceId,
+ $params[0],
+ isset($params[1]) ? $params[1] : 0,
+ );
+ }
+ else {
+ foreach ($params as $listener) {
+ $this->listenerIds[$eventName][] = array(
+ $serviceId,
+ $listener[0],
+ isset($listener[1]) ? $listener[1] : 0,
+ );
+ }
+ }
+ }
+ }
+
+ /**
+ * Lazily loads listeners for this event from the dependency injection
+ * container.
+ *
+ * @param string $eventName The name of the event to dispatch. The name of
+ * the event is the name of the method that is
+ * invoked on listeners.
+ */
+ protected function lazyLoad($eventName) {
+ if (isset($this->listenerIds[$eventName])) {
+ foreach ($this->listenerIds[$eventName] as list($serviceId, $method, $priority)) {
+ $listener = \Civi\Core\Container::singleton()->get($serviceId);
+ $key = $serviceId . '.' . $method;
+ if (!isset($this->listeners[$eventName][$key])) {
+ $this->addListener($eventName, array($listener, $method), $priority);
+ }
+ elseif ($this->listeners[$eventName][$key] !== $listener) {
+ parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
+ $this->addListener($eventName, array($listener, $method), $priority);
+ }
+
+ $this->listeners[$eventName][$key] = $listener;
+ }
+ }
+ }
+
}
'Civi\Angular\Manager',
[]
))
- ->setFactory([new Reference(self::SELF), 'createAngularManager']);
+ ->setFactory([new Reference(self::SELF), 'createAngularManager'])->setPublic(TRUE);
$container->setDefinition('dispatcher', new Definition(
'Civi\Core\CiviEventDispatcher',
[new Reference('service_container')]
))
- ->setFactory([new Reference(self::SELF), 'createEventDispatcher']);
+ ->setFactory([new Reference(self::SELF), 'createEventDispatcher'])->setPublic(TRUE);
$container->setDefinition('magic_function_provider', new Definition(
'Civi\API\Provider\MagicFunctionProvider',
[]
- ));
+ ))->setPublic(TRUE);
$container->setDefinition('civi_api_kernel', new Definition(
'Civi\API\Kernel',
[new Reference('dispatcher'), new Reference('magic_function_provider')]
))
- ->setFactory([new Reference(self::SELF), 'createApiKernel']);
+ ->setFactory([new Reference(self::SELF), 'createApiKernel'])->setPublic(TRUE);
$container->setDefinition('cxn_reg_client', new Definition(
'Civi\Cxn\Rpc\RegistrationClient',
[]
))
- ->setFactory('CRM_Cxn_BAO_Cxn::createRegistrationClient');
+ ->setFactory('CRM_Cxn_BAO_Cxn::createRegistrationClient')->setPublic(TRUE);
- $container->setDefinition('psr_log', new Definition('CRM_Core_Error_Log', []));
+ $container->setDefinition('psr_log', new Definition('CRM_Core_Error_Log', []))->setPublic(TRUE);
$basicCaches = [
'js_strings' => 'js_strings',
$container->setDefinition("cache.{$cacheSvc}", new Definition(
'CRM_Utils_Cache_Interface',
[$definitionParams]
- ))->setFactory('CRM_Utils_Cache::create');
+ ))->setFactory('CRM_Utils_Cache::create')->setPublic(TRUE);
}
// PrevNextCache cannot use memory or array cache at the moment because the
'type' => ['SqlGroup'],
],
]
- ))->setFactory('CRM_Utils_Cache::create');
+ ))->setFactory('CRM_Utils_Cache::create')->setPublic(TRUE);
$container->setDefinition('sql_triggers', new Definition(
'Civi\Core\SqlTriggers',
[]
- ));
+ ))->setPublic(TRUE);
$container->setDefinition('asset_builder', new Definition(
'Civi\Core\AssetBuilder',
[]
- ));
+ ))->setPublic(TRUE);
$container->setDefinition('themes', new Definition(
'Civi\Core\Themes',
[]
- ));
+ ))->setPublic(TRUE);
$container->setDefinition('pear_mail', new Definition('Mail'))
->setFactory('CRM_Utils_Mail::createMailer');
$container->setDefinition($name, new Definition(
$class
))
- ->setFactory([$class, 'singleton']);
+ ->setFactory([$class, 'singleton'])->setPublic(TRUE);
}
$container->setAlias('cache.short', 'cache.default');
$container->setDefinition('resources', new Definition(
'CRM_Core_Resources',
[new Reference('service_container')]
- ))->setFactory([new Reference(self::SELF), 'createResources']);
+ ))->setFactory([new Reference(self::SELF), 'createResources'])->setPublic(TRUE);
$container->setDefinition('prevnext', new Definition(
'CRM_Core_PrevNextCache_Interface',
[new Reference('service_container')]
- ))->setFactory([new Reference(self::SELF), 'createPrevNextCache']);
+ ))->setFactory([new Reference(self::SELF), 'createPrevNextCache'])->setPublic(TRUE);
$container->setDefinition('prevnext.driver.sql', new Definition(
'CRM_Core_PrevNextCache_Sql',
[]
- ));
+ ))->setPublic(TRUE);
$container->setDefinition('prevnext.driver.redis', new Definition(
'CRM_Core_PrevNextCache_Redis',
[new Reference('cache_config')]
- ));
+ ))->setPublic(TRUE);
$container->setDefinition('cache_config', new Definition('ArrayObject'))
- ->setFactory([new Reference(self::SELF), 'createCacheConfig']);
+ ->setFactory([new Reference(self::SELF), 'createCacheConfig'])->setPublic(TRUE);
$container->setDefinition('civi.mailing.triggers', new Definition(
'Civi\Core\SqlTrigger\TimestampTriggers',
['civicrm_mailing', 'Mailing']
- ))->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo']);
+ ))->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo'])->setPublic(TRUE);
$container->setDefinition('civi.activity.triggers', new Definition(
'Civi\Core\SqlTrigger\TimestampTriggers',
['civicrm_activity', 'Activity']
- ))->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo']);
+ ))->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo'])->setPublic(TRUE);
$container->setDefinition('civi.case.triggers', new Definition(
'Civi\Core\SqlTrigger\TimestampTriggers',
['civicrm_case', 'Case']
- ))->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo']);
+ ))->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo'])->setPublic(TRUE);
$container->setDefinition('civi.case.staticTriggers', new Definition(
'Civi\Core\SqlTrigger\StaticTriggers',
],
]
))
- ->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo']);
+ ->addTag('kernel.event_listener', ['event' => 'hook_civicrm_triggerInfo', 'method' => 'onTriggerInfo'])->setPublic(TRUE);
$container->setDefinition('civi_token_compat', new Definition(
'Civi\Token\TokenCompatSubscriber',
[]
- ))->addTag('kernel.event_subscriber');
+ ))->addTag('kernel.event_subscriber')->setPublic(TRUE);
$container->setDefinition("crm_mailing_action_tokens", new Definition(
"CRM_Mailing_ActionTokens",
[]
- ))->addTag('kernel.event_subscriber');
+ ))->addTag('kernel.event_subscriber')->setPublic(TRUE);
foreach (['Activity', 'Contribute', 'Event', 'Mailing', 'Member'] as $comp) {
$container->setDefinition("crm_" . strtolower($comp) . "_tokens", new Definition(
"CRM_{$comp}_Tokens",
[]
- ))->addTag('kernel.event_subscriber');
+ ))->addTag('kernel.event_subscriber')->setPublic(TRUE);
}
\CRM_Api4_Services::hook_container($container);
/**
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container
- * @return \Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher
+ * @return \Symfony\Component\EventDispatcher\EventDispatcher
*/
public function createEventDispatcher($container) {
- $dispatcher = new CiviEventDispatcher($container);
+ $dispatcher = new CiviEventDispatcher();
if (\CRM_Core_Config::isUpgradeMode()) {
$dispatcher->setDispatchPolicy(\CRM_Upgrade_DispatchPolicy::get('upgrade.main'));
}
"cache/integration-tests": "~0.16.0",
"dompdf/dompdf" : "0.8.*",
"electrolinux/phpquery": "^0.9.6",
- "symfony/config": "^2.8.50 || ~3.0",
+ "symfony/config": "^2.8.50 || ~3.0 || ~4.4",
"symfony/polyfill-iconv": "~1.0",
- "symfony/dependency-injection": "^2.8.50 || ~3.0",
- "symfony/event-dispatcher": "^2.8.50 || ~3.0",
- "symfony/filesystem": "^2.8.50 || ~3.0",
- "symfony/process": "^2.8.50 || ~3.0",
+ "symfony/dependency-injection": "^2.8.50 || ~3.0 || ~4.4",
+ "symfony/event-dispatcher": "^2.8.50 || ~3.0 || ~4.4",
+ "symfony/filesystem": "^2.8.50 || ~3.0 || ~4.4",
+ "symfony/process": "^2.8.50 || ~3.0 || ~4.4",
"psr/log": "~1.0",
- "symfony/finder": "^2.8.50 || ~3.0",
+ "symfony/finder": "^2.8.50 || ~3.0 || ~4.4",
"tecnickcom/tcpdf" : "6.2.*",
"totten/ca-config": "~17.05",
"zetacomponents/base": "1.9.*",