рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рд╕рд░рд▓ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдирд╛ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреИрдХрдЧрд┐рд╕реНрдЯ рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд╢рд╛рдо рдХрд╛ рдкреИрдХреЗрдЬ рдорд┐рд▓рд╛, рдЬреЛ рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЪрдпрди рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛:

рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ "рдЦреБрдж рдХреЗ рд▓рд┐рдП" рдЦрддреНрдо рдХрд░рдиреЗ рдФрд░ рдХрдВрдШреА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдШрдЯрдирд╛ рдкреАрдврд╝реА рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛


рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬрд┐рдирдХреЗ рдирд╛рдо рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдХреБрдВрдЬреА ( foo.bar.baz ) рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП:

"рдЗрд╡реЗрдВрдЯ" рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╛ "рдЕрднреА рддрдХ" рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдФрд░ "рдШрдЯрдирд╛" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдмреАрдЪ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред

Eventable


рдереЛрдбрд╝рд╛ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрд╛рдП рдЧрдП рдЗрд╡рдирдореЗрдВрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред

рдШрдЯрдирд╛ рдкреНрд░реЗрд╖рдг

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ jQuery рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдЧреМрд░ рдХрд┐рдпрд╛: on() , one() , off() , trigger() ред рдореБрдЭреЗ рдЗрд╕рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рдЖрдпрд╛ред

рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:
 Dispatcher { public Dispatcher on(string $event, callable $listener) public Dispatcher once(string $event, callable $listener) public Dispatcher off([string $event [, callable $listener ]]) public Dispatcher trigger(string $event [, array $args ]) public Dispatcher fire(string $event [, array $args ]) } 

рддреЛ, off() рд╡рд┐рдзрд┐ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗ рд╕рдХрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдИрд╡реЗрдВрдЯ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╛ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдП рдЧрдП рд╕рднреА рдИрд╡реЗрдВрдЯ рдФрд░ рд╣реИрдВрдбрд▓рд░ рд╣рдЯрд╛рдирд╛ред

trigger() рдПрдХ рдИрд╡реЗрдВрдЯ рдХреБрдВрдЬреА рдкреИрдЯрд░реНрди рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдорд┐рд▓рд╛рди рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИред
fire() рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдПрдХрд▓, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдЙрдард╛рддреА рд╣реИред

рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЗрд╕реЗ рдПрдХ once() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдШрдЯрдирд╛ рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

Dispatcher.php
 namespace Yowsa\Eventable; class Dispatcher { protected $events = []; public function on($event, callable $listener) { if (!KeysResolver::isValidKey($event)) { throw new \InvalidArgumentException('Invalid event name given'); } if (!isset($this->events[$event])) { $this->events[$event] = []; } $this->events[$event][] = $listener; return $this; } public function once($event, callable $listener) { $onceClosure = function () use (&$onceClosure, $event, $listener) { $this->off($event, $onceClosure); call_user_func_array($listener, func_get_args()); }; $this->on($event, $onceClosure); return $this; } public function off($event = null, callable $listener = null) { if (empty($event)) { $this->events = []; } elseif (empty($listener)) { $this->events[$event] = []; } elseif (!empty($this->events[$event])) { $index = array_search($listener, $this->events[$event], true); if (false !== $index) { unset($this->events[$event][$index]); } } return $this; } public function trigger($event, array $args = []) { $matchedEvents = KeysResolver::filterKeys($event, array_keys($this->events)); if (!empty($matchedEvents)) { if (is_array($matchedEvents)) { foreach ($matchedEvents as $eventName) { $this->fire($eventName, $args); } } else { $this->fire($matchedEvents, $args); } } return $this; } public function fire($event, array $args = []) { foreach ($this->events[$event] as $listener) { call_user_func_array($listener, $args); } return $this; } } 


рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреАрдЬрд╝

рдЖрдзрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдХрджрдо рдЯреЗрдореНрдкрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдИрд╡реЗрдВрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рднреА рд╕рдорд╛рди рдХреБрдВрдЬреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде:

рдореБрдЦреНрдп application.user.signin.error рдХреЗ рд▓рд┐рдП .user.signin.error application.user.signin.error рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреАрди рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:
 KeysResolver { public static int isValidKey(string $key) public static string getKeyRegexPattern(string $key) public static mixed filterKeys(string $pattern [, array $keys ]) } 


рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реИрдиреНрдп: рдХреБрдВрдЬреА рд╕рддреНрдпрд╛рдкрди, рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рдкреНрд░рдореБрдЦ рд╕рд░рдгреА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ред
KeysResolver.php
 namespace Yowsa\Eventable; class KeysResolver { public static function isValidKey($key) { return preg_match('/^(([\w\d\-]+)\.?)+[^\.]$/', $key); } public static function getKeyRegexPattern($key) { $pattern = ('*' === $key) ? '([^\.]+)' : (('**' === $key) ? '(.*)' : str_replace( array('\*\*', '\*'), array('(.+)', '([^.]*)'), preg_quote($key) ) ); return '/^' . $pattern . '$/i'; } public static function filterKeys($pattern, array $keys = array()) { $matched = preg_grep(self::getKeyRegexPattern($pattern), $keys); if (empty($matched)) { return null; } if (1 === count($matched)) { return array_shift($matched); } return array_values($matched); } } 


рдкреВрд░рд╛ рдкреИрдХреЗрдЬ рджреЛ рд╕рд░рд▓ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рдВрдЧреАрддрдХрд╛рд░-рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдИрд╡реЗрдВрдЯреЗрдмрд▓ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдиреАрдЪреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред
 require_once __DIR__ . '/../vendor/autoload.php'; $dispatcher = new Yowsa\Eventable\Dispatcher(); $teacher = 'Mrs. Teacher'; $children = ['Mildred', 'Nicholas', 'Kevin', 'Bobby', 'Anna', 'Kelly', 'Howard', 'Christopher', 'Maria', 'Alan']; // teacher comes in the classroom // and children welcome her once $dispatcher->once('teacher.comes', function($teacher) use ($children) { foreach ($children as $kid) { printf("%-12s- Hello, %s!\n", $kid, $teacher); } }); // every kid answers to teacher once foreach ($children as $kid) { $dispatcher->once("children.{$kid}.says", function() use ($kid) { echo "Hi {$kid}!\n"; }); } // boddy cannot stop to talk $dispatcher->on('children.Bobby.says', function() { echo "\tBobby: I want pee\n"; }); // trigger events echo "{$teacher} is entering the classroom.\n\n"; $dispatcher->trigger('teacher.comes', [$teacher]); echo "\n\n{$teacher} welcomes everyone personally\n\n"; $dispatcher->trigger('children.*.says'); for ($i = 0; $i < 5; $i++) { $dispatcher->trigger('children.Bobby.says'); } 

Rezyultat
 Mrs. Teacher is entering the classroom. Mildred тАФ Hello, Mrs. Teacher! Nicholas тАФ Hello, Mrs. Teacher! Kevin тАФ Hello, Mrs. Teacher! Bobby тАФ Hello, Mrs. Teacher! Anna тАФ Hello, Mrs. Teacher! Kelly тАФ Hello, Mrs. Teacher! Howard тАФ Hello, Mrs. Teacher! Christopher тАФ Hello, Mrs. Teacher! Maria тАФ Hello, Mrs. Teacher! Alan тАФ Hello, Mrs. Teacher! Mrs. Teacher welcomes everyone personally Hi Mildred! Hi Nicholas! Hi Kevin! Hi Bobby! Bobby: I want pee Hi Anna! Hi Kelly! Hi Howard! Hi Christopher! Hi Maria! Hi Alan! Bobby: I want pee Bobby: I want pee Bobby: I want pee Bobby: I want pee Bobby: I want pee 


рд╢рд╛рдпрдж рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ

рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд░рд┐рдд:

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛:

Source: https://habr.com/ru/post/In202234/


All Articles