Official documentation: hexdocs.
The event manager helps you manage subscriptions to specific events. Thanks to this lib, you'll be able to easily reduce coupling.
Inspired by the EventDispatcher package from Symfony Framework and adapted for
functionnal programming.
def deps do
[
{:event_manager, "~> 0.1.0"}
]
endBefore using the lib you first have to register it using EventManager.start_link/1, which
also accepts a keyword opts for options. Inside your options, you can specify all the apps that
can use the @subscribe attribute.
Here's an example using a Supervisor:
children = [%{
id: EventManager,
start: {EventManager, :start_link, [[apps: [:manager]]]}
}]
opts = [strategy: :one_for_one, name: Manager.Supervisor]
Supervisor.start_link(children, opts)In this quickstart we'll define a mailing system that sends an email when a new user is created. In this example, we assume you know Ecto basics and how to define a user schema.
First, let's create a module that will handle the user_created event, that will be
dispatched when a new user is created.
This module will send an email when the user_created event is dispatched.
defmodule Mail do
use EventManager.Handler
# ... other functions
@subscribe "user_created"
def on_user_created(_pid, user) do
Mail.send_welcome(user)
end
endThe on_user_created function will be called each time we dispatch the event user_created.
We assume that user will be sent as the event's parameter.
When using @subscribe event_name the system will call the function on_#{event_name} as the default
callback.
Then, we'll create a User module with the create/1 function. This function will dispatch a
user_created event when the user has been inserted into the database.
defmodule User do
# ... ecto schema and changeset (according to ecto)
def create(user_params) do
user = %__MODULE__{}
|> changeset(user_params)
|> MyApp.Repo.insert()
with {:ok, _} <- user do
EventManager.dispatch("user_created", user)
end
user
end
endThere are 2 ways to register a subscriber.
- Dynamically
EventManager.subscribe("event_name", {MyApp, :callback})- Staticly
@subscribe "event_name"
# or
@subscribe event: "event_name", callback: :function_nameIn case you only use
@subscribe "event_name", the callback's name will beon_event_name.
Modules that use static subscriptions must use the module EventManager.Handler. Using this module will
define a function called subscriptions/0 that returns the list of subscribed events. It will also register
your callback automatically for the specified event.