Skip to content

Commit 78f99f2

Browse files
rootdkgroot
authored andcommitted
added event filters
Added the capability of specifying an array of filters during event registration. Filters are specified as regular expressions. Example: $client->registerEventListener( function($event) {var_dump($event);}, array( 'event' => '/Hangup/', 'channel' => '/Local\/27.*/', ) ); Cherry-Picked b442e8c from @sctt (marcelog#107)
1 parent 85823d2 commit 78f99f2

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

src/PAMI/Client/Impl/ClientImpl.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,12 @@ protected function dispatch(IncomingMessage $message)
337337
foreach ($this->eventListeners as $data) {
338338
$listener = $data[0];
339339
$predicate = $data[1];
340-
if (is_callable($predicate) && !call_user_func($predicate, $message)) {
340+
341+
if (!$this->evaluatePredicate($predicate, $message))
342+
{
341343
continue;
342344
}
345+
343346
if ($listener instanceof \Closure) {
344347
$listener($message);
345348
} elseif (is_array($listener)) {
@@ -350,6 +353,33 @@ protected function dispatch(IncomingMessage $message)
350353
}
351354
}
352355

356+
/**
357+
* Evaluate a predicate for a message.
358+
*
359+
* @param $predicate a closure or an array of filters.
360+
* @param \PAMI\Message\IncomingMessage $message Message to compare.
361+
*
362+
* @return bool
363+
*/
364+
protected function evaluatePredicate($predicate, IncomingMessage $message)
365+
{
366+
if (is_callable($predicate)) {
367+
return call_user_func($predicate, $message);
368+
}
369+
370+
if (!is_array($predicate)) {
371+
return true;
372+
}
373+
374+
foreach ($predicate as $key => $value) {
375+
if (!preg_match($value, $message->getKey($key))) {
376+
return false;
377+
}
378+
}
379+
380+
return true;
381+
}
382+
353383
/**
354384
* Returns a ResponseMessage from a raw string that came from asterisk.
355385
*

0 commit comments

Comments
 (0)