Eventos
O PivotPHP usa o padrão PSR-14 (Psr\EventDispatcher). Eventos são objetos e os
listeners são registrados pela classe do evento na Application.
Registrando listeners
Use $app->on() (ou $app->addEventListener(), que é o mesmo) passando a classe do evento:
$app->on(UserRegistered::class, function (UserRegistered $event) {
// ...
});
Disparando eventos
$app->dispatchEvent(new UserRegistered('joao@exemplo.com'));
dispatchEvent() recebe o objeto do evento e o devolve ao final.
Eventos genéricos
Para eventos simples, use a classe PivotPHP\Core\Events\Event, que carrega um nome e um
array de dados:
use PivotPHP\Core\Events\Event;
$app->on(Event::class, function (Event $event) {
$name = $event->getName();
$email = $event->get('email');
});
$app->dispatchEvent(new Event('user.registered', ['email' => 'joao@exemplo.com']));
Métodos de Event: getName(), getData(), get($key, $default), set($key, $value) e
stopPropagation().
Hooks
PivotPHP\Core\Events\Hook é um evento extensível para extensões (implementa
Psr\EventDispatcher\StoppableEventInterface):
use PivotPHP\Core\Events\Hook;
$app->on(Hook::class, function (Hook $hook) {
if ($hook->isPropagationStopped()) {
return;
}
// ...
});
$app->dispatchEvent(new Hook('extension.ready', ['data' => '...']));
Eventos do ciclo de vida
O núcleo define eventos do ciclo de vida da requisição:
PivotPHP\Core\Events\ApplicationStartedPivotPHP\Core\Events\RequestReceived(propriedadesrequestereceivedAt)PivotPHP\Core\Events\ResponseSent
Exemplo completo
use PivotPHP\Core\Core\Application;
use PivotPHP\Core\Events\Event;
$app = new Application();
$app->on(Event::class, function (Event $event) use ($app) {
$app->getLogger()?->info('Evento: ' . $event->getName());
});
$app->get('/registrar', function ($req, $res) use ($app) {
$app->dispatchEvent(new Event('user.registered', ['email' => 'joao@exemplo.com']));
return $res->json(['ok' => true]);
});
$app->run();
Limitações
- Não há filas, assinantes com curinga, prioridades nem
Event::fake(). - Registre e dispare classes de evento (PSR-14). O par
on('string')+fireEvent()não é a forma de uso —fireEvent()apenas cria um objeto de evento e o despacha.