Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Question - Best way for modules to attach listeners #40

Description

@cgaube

Hello
First my apologies if this is not the right place to ask questions.
Please let me know if there is a better place -
Thank you


Here is my issue
I was wondering what would be the best way to attach listeners to an Event Manager from a Different Module

Here is my scenario, I have a user form lets call it Application\UserForm

In its class factory I inject an Event Manager and a Shared Event Manager

factory:

$userForm = new UserForm();

$sharedEventManager = $container->get('FormSharedEventManager');
$eventManager =  new EventManager($sharedEventManager);

$userForm->setEventManager($eventManager);

What is the Best way for another module (lets call it Module X) to attach its listener to this Form (and any other forms really that use the same FormSharedEventManager ) ?

Here are my choices

Delegators

I could add Delegators in the Module X Config

Option 1: at the UserForm level
--> so that everytime UserForm is created My delegator class would fetch the event manager and directly attach listeners

Option 2
-> Same idea but at the shared event manager level
Everytime FormSharedEventManager is created i would attach the listeners
(That also allow me to use the identifiers )

Config file parameters

Option 3:
i could create a new config parameter

return [
  'shared_event_manager_listeners' => [ 
        'FormSharedEventManager::class => [
                 ModuleXFormListenersAggregate::class
         ]
  ]
];

And I would have a to use a new Factory to create FormSharedEventManager

'factories' => [
    FormSharedEventManager::class => AggregateAwareSharedEventManagerFACTORY::class
]

My new Factory (AggregateAwareSharedEventManagerFACTORY)
Would then fetch all the listeners aggregates from the "shared_event_manager_listers" config attached to the requested class (FormSharedEventManager::class)

I want to use the fastest or cleanest way to attach those listeners
Ideally the Module would also add listeners to other part of the process

Pros and Cons

Option 1:

  • Pros: The listeners are only attached when we need create UserForm class
  • Cons: Need to create a Delegator file for each forms that the module want to listen to

Option 2:

  • Pros: Using the SharedEvent Manager I can use identifiers and thus attach all my Event from ONE delegator file
  • Cons: ?

Option 3:

  • Pros: We are not using delegators - so it might be faster ? (am I right to assume so ?)
  • Cons:
    Need to create new parameter in the config, Need to create a new factory

Ideally Module X would also want to listen to other events like Controller Events
For e.g When a user submit the form Module X will want to send an email
Would it be smarter to Inject the default Shared Event Manager into my Form instead of creating a new FormSharedEventManager
and attaching the listeners into the Default shared event manager ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions