Rules uses the Symfony event dispatching system to trigger events and invoke reaction rules when an event occurs. A module that wants to provide events can do so without having a module dependency to Rules - dispatching standard Symfony events in code is enough.

In order to make an event known to Rules a * file has to be provided to register the event(s). Example from Rules itself:

  label: 'User has logged in'
  category: 'User'
      type: 'entity:user'
      label: 'Logged in user'

This entry registers an event called "rules_user_login" which has one context parameter called "account".

Next, an event class should be declared (you can also use Symfony's GenericEvent directly, but an explicit class is encouraged):

class UserLoginEvent extends GenericEvent {

  const EVENT_NAME = 'rules_user_login';


Invoking the event looks like this:

// Set the account twice on the event: as the main subject but also in the
// list of arguments.
$event = new UserLoginEvent($account, ['account' => $account]);
$event_dispatcher = \Drupal::service('event_dispatcher');
$event_dispatcher->dispatch(UserLoginEvent::EVENT_NAME, $event);

An instance of the UserLoginEvent class is created, passing along the account user object as context parameter. The event dispatching service is used to invoke all event subscribers. Rules itself is among those subscribers with its GenericEventSubscriber class which will trigger all reaction rules that are configured for the event.

Note: Do not use \Drupal when invoking events from within a class, use dependency injection for the event dispatcher service instead.

Note 2: Make sure to issue a service container rebuild or cache clear when you configure and save new reaction rules, so that the event registration is picked up.