{"id":307572,"date":"2020-07-27T21:00:36","date_gmt":"2020-07-27T21:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=307572"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=307572","title":{"rendered":"\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u0430\u043a \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u00ab\u0434\u043e\u043f\u0438\u043b\u0443\u00bb"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/512384\/\">\n<p>\u0417\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442, \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0431\u044b\u0441\u0442\u0440\u043e, \u0442.\u043a. \u043d\u0430 \u043d\u0435\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u044b \u0434\u0435\u043d\u044c\u0433\u0438, \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u044b \u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0433\u0434\u0435-\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043b\u0438, \u0433\u0434\u0435-\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u043b\u0438, \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b\u0438, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435 \u0440\u0430\u0434\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0418, \u0432\u0440\u043e\u0434\u0435, \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e\u2026 <\/p>\n<p>  <\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438. \u0417\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u044d\u0442\u043e \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u0437\u0440\u044f. <\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. \u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443 \u0437\u0430\u043f\u0438\u043b\u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 e-mail-\u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 \u00ab\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u043b \u044d\u0442\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0441\u044e\u0434\u0430\u00bb. \u0418\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0442\u0438\u0440\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u043e. <\/p>\n<p>  <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/766\/967\/db9\/766967db98fb8ab7bb038e0be395f1b4.jpg\" width=\"700\" height=\"394\" alt=\"Event subsystem \/ \u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\"><\/p>\n<p>\u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. <\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0447\u0442\u043e-\u0442\u043e \u0438\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f, \u043e\u0431\u043d\u043e\u0432\u0438\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044f, \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b \u043f\u043e\u043a\u0443\u043f\u043a\u0443 \u0438 \u0442.\u043f. <\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 CRM \u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c. <\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u0442\u0430\u043a \u0438 \u043f\u043e \u043d\u0435\u043a\u043e\u0435\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e 20 \u043b\u0435\u0442, \u0442\u043e \u0435\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u0441\u044c\u043c\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430, \u0430 \u0435\u0441\u043b\u0438 60, \u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e. <\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u043d\u0430 PHP \u043d\u0430 Laravel. \u0412 \u044d\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430. <\/p>\n<p>  <a href=\"https:\/\/1drv.ms\/u\/s!Aru09Ww00RyMiLQJrJivK0FPSix0Ag?e=2NvVK2\" rel=\"nofollow\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/277\/a0f\/0ea\/277a0f0ea025acc48f1e6811e0862b15.jpg\" width=\"1024\" height=\"702\" alt=\"Event subsystem scheme \/ \u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 - \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\"><\/a>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0435 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e, \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0435\u043c\u0443, \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0441\u0451\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440. <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php App\\Interfaces\\Events    use Illuminate\\Contracts\\Support\\Arrayable;    \/**  * System event  * @package App\\Interfaces\\Events  *\/  interface SystemEvent extends Arrayable  {        \/**       * Get event id       *       * @return string       *\/      public static function getId(): string;        \/**       * Event name       *       * @return string       *\/      public static function getName(): string;        \/**       * Available params       *       * @return array       *\/      public static function getAvailableParams(): array;        \/**       * Get param by name       *       * @param string $name       *       * @return mixed       *\/      public function getParam(string $name);  }  <\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0449\u0451 \u0435\u0441\u0442\u044c \u043f\u0443\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0412 \u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Interfaces\\Events;    \/**  * Interface for event pool  * @package App\\Interfaces\\Events  *\/  interface EventsPool  {      \/**       * Register event       *       * @param string $event       *       * @return mixed       *\/      public function register(string $event): self;        \/**       * Get events list       *       * @return array       *\/      public function getAvailableEvents(): array;        \/**       * @param string $alias       *       * @param array  $params       *       * @return mixed       *\/      public function create(string $alias, array $params = []);  }  <\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0438\u043c\u0435\u044e\u0449\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0418 \u043e\u043d, \u043a\u0430\u043a \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435, \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438 ID. <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Interfaces\\Actions;    \/**  * Interface for system action  * @package App\\Interfaces\\Actions  *\/  interface Action  {      \/**       * Get ID       *       * @return string       *\/      public static function getId(): string;        \/**       * Get name       *       * @return string       *\/      public static function getName(): string;        \/**       * Available input params       *       * @return array       *\/      public static function getAvailableInput(): array;        \/**       * Available output params       *       * @return array       *\/      public static function getAvailableOutput(): array;        \/**       * Run action       *       * @param array $params       *       * @return void       *\/      public function run(array $params): void;  }  <\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0442\u0430\u043a \u0436\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043a\u0430\u043a \u0443 \u043f\u0443\u043b\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. <\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c gui \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0432\u044f\u0437\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0423 \u043c\u0435\u043d\u044f \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c knockout.js, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e. <\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/44c\/f88\/1a9\/44cf881a97a3cd336533a4c5d7cbbe9a.png\" width=\"1024\" height=\"715\" title=\"\u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 - \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\">  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0435\u0441\u0442\u044c \u0431\u043b\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430 \u2013 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0438\u0434\u0451\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435. <\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0442\u0430\u043a \u0436\u0435 \u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043b\u043e\u043d\u043a\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u2013 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u0412 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u0437 \u0441\u043e\u0431\u044b\u0442\u0438\u044f(\u044d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0430). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e e-mail \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f 0, \u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u0446.\u0441\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f 1, \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 email- \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430 Sendsay. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u00ab\u0430\u043d\u043a\u0435\u0442\u0430\u00bb \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Sendsay. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438, \u0432 \u043d\u0435\u0451 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u0441\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e. \u042d\u0442\u043e \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443, \u0432\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432 \u0430\u043d\u043a\u0435\u0442\u0435, \u0430 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f \u043f\u043e\u043b\u044f. <\/p>\n<p>  <\/p>\n<p>\u0421\u0432\u044f\u0437\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439. <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Interfaces\\Events;    \/**  * Interface for event processor  * @package App\\Interfaces\\Events  *\/  interface EventProcessor  {      \/**       * Process system event       *       * @param SystemEvent $event       * @param array       $settings       *\/      public function process(SystemEvent $event, array $settings = []): void;  }  <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Interfaces\\Events;    \/**  * Interface for event processor  * @package App\\Interfaces\\Events  *\/  interface EventProcessor  {      \/**       * Process system event       *       * @param SystemEvent $event       * @param array       $settings       *\/      public function process(SystemEvent $event, array $settings = []): void;  }  <\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 process \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432 SystemEventListener. <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Listeners;    use App\\Interfaces\\Events\\SystemEvent;  use App\\Interfaces\\Events\\EventProcessor;  use App\\Models\\EventSettings;  use Illuminate\\Support\\Collection;    class SystemEventListener  {      \/** @var EventProcessor *\/      private $eventProcessor;        public function __construct(EventProcessor $eventProcessor)      {          $this-&gt;setEventProcessor($eventProcessor);      }        public function handle(SystemEvent $event): void      {          EventSettings::query()-&gt;where('is_active', true)-&gt;where('event_id', $event::getId())-&gt;chunk(10, function (Collection $collection) use ($event) {              $collection-&gt;each(function (EventSettings $model) use ($event) {                  $this-&gt;getEventProcessor()-&gt;process($event, $model-&gt;settings);              });          });      }        \/**       * @return EventProcessor       *\/      public function getEventProcessor(): EventProcessor      {          return $this-&gt;eventProcessor;      }        \/**       * @param EventProcessor $eventProcessor       *       * @return $this       *\/      public function setEventProcessor(EventProcessor $eventProcessor): self      {          $this-&gt;eventProcessor = $eventProcessor;            return $this;      }  }  <\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0432 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0435: <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Providers;    use App\\Interfaces\\Events\\SystemEvent;  use App\\Listeners\\SystemEventListener;  use Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider as ServiceProvider;     class EventServiceProvider extends ServiceProvider  {      \/**       * The event listener mappings for the application.       *       * @var array       *\/      protected $listen = [            SystemEvent::class            =&gt; [              SystemEventListener::class,          ],        ];  } <\/code><\/pre>\n<p>  <\/p>\n<p><b>\u0412 \u0438\u0442\u043e\u0433\u0435<\/b> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0412\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u041d\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\/\u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0430\u0434\u043c\u0438\u043d\u043a\u0438, \u0447\u0442\u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. <\/p>\n<p>  <\/p>\n<p>\u0418 \u0435\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0438 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: <\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Interfaces\\Services;    \/**  * Interface for service to filter data (from HUB)  * @package App\\Interfaces\\Services  *\/  interface Filter  {      public const CONDITION_EQUAL = '=';        public const CONDITION_MORE = '&gt;';        public const CONDITION_LESS = '&lt;';        public const CONDITION_NOT = '!';        public const CONDITION_BETWEEN = 'between';        public const CONDITION_IN = 'in';        public const CONDITION_EMPTY = 'empty';        \/**       * Filter data       *       * @param array $filter       * @param array $data       *       * @return array       *\/      public function filter(array $filter, array $data): array;        \/**       * Check conditions       *       * @param array $conditions       * @param array $data       *       * @return bool       *\/      public function check(array $conditions, array $data): bool;  }  <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Services;    use Illuminate\\Support\\Arr;  use App\\Interfaces\\Services\\Filter as IFilter;    \/**  * Service to filter data by conditions     * @package App\\Services  *\/  class Filter implements IFilter  {        \/**       * Filter data       *       * @param array $filter       * @param array $data       *       * @return array       *\/      public function filter(array $filter, array $data): array      {          if (!empty($filter)) {              foreach ($filter as $condition) {                  $field = $condition['field'] ?? null;                  if (empty($field)) {                      continue;                  }                  $operation = $condition['operation'] ?? null;                  $value1 = $condition['value1'] ?? null;                  $value2 = $condition['value2'] ?? null;                  $success = $condition['success'] ?? null;                  $filterResult = $condition['result'] ?? null;                    $value = Arr::get($data, $field, '');                  if ($field !== null &amp;&amp; $this-&gt;checkCondition($value, $operation, $value1, $value2)) {                      return $success !== null ? $this-&gt;filter($success, $data) : $filterResult;                  }              }          }            return [];      }        \/**       * Check condition       *       * @param $value       * @param $condition       * @param $value1       * @param $value2       *       * @return bool       *\/      protected function checkCondition($value, $condition, $value1, $value2): bool      {          $result = false;          $value = \\is_string($value) ? mb_strtolower($value) : $value;          $value1 = \\is_string($value1) ? mb_strtolower($value1) : $value1;          if ($value2 !== null) {              $value2 = \\is_string($value2) ? mb_strtolower($value2) : $value2;          }          $conditions = explode('|', $condition);          $invert = \\in_array(self::CONDITION_NOT, $conditions);          $conditions = array_filter($conditions, function ($item) {              return $item !== self::CONDITION_NOT;          });          $condition = implode('|', $conditions);          switch ($condition) {              case self::CONDITION_EQUAL:                  $result = ($value == $value1);                  break;              case self::CONDITION_IN:                  $result = \\in_array($value, (array)$value1);                  break;              case self::CONDITION_LESS:                  $result = ($value &lt; $value1);                  break;              case self::CONDITION_MORE:                  $result = ($value &gt; $value1);                  break;              case self::CONDITION_MORE . '|' . self::CONDITION_EQUAL:              case self::CONDITION_EQUAL . '|' . self::CONDITION_MORE:                  $result = ($value &gt;= $value1);                  break;              case self::CONDITION_LESS . '|' . self::CONDITION_EQUAL:              case self::CONDITION_EQUAL . '|' . self::CONDITION_LESS:                  $result = ($value &lt;= $value1);                  break;              case self::CONDITION_BETWEEN:                  $result = (($value &gt;= $value1) &amp;&amp; ($value &lt;= $value2));                  break;              case self::CONDITION_EMPTY:                  $result = empty($value);                  break;          }            return $invert ? !$result : $result;      }        \/**       * Check conditions       *       * @param array $conditions       * @param array $data       *       * @return bool       *\/      public function check(array $conditions, array $data): bool      {          $result = true;          if (!empty($conditions)) {              foreach ($conditions as $condition) {                  $field = $condition['param'] ?? null;                  if (empty($field)) {                      continue;                  }                  $operation = $condition['condition'] ?? null;                  $value1 = $condition['value'] ?? null;                  $value2 = $condition['value2'] ?? null;                    $value = Arr::get($data, $field, '');                    $result &amp;= $this-&gt;checkCondition($value, $operation, $value1, $value2);              }          }            return $result;      }  }  <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Interfaces\\Services;    \/**  * Interface for service to map params  * @package App\\Interfaces\\Services  *\/  interface FieldMapper  {      \/**       * Map       *       * @param array $map       * @param array $data       *       * @return array       *\/      public function map(array $map, array $data): array;  }  <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php namespace App\\Services;    use Illuminate\\Support\\Arr;  use App\\Interfaces\\Services\\FieldMapper as IFieldMapper;    \/**  * Params\/fields mapper (by HUB)  * @package App\\Services  *\/  class FieldMapper implements IFieldMapper  {        \/**       * Map       *       * @param array $map       * @param array $data       *       * @return array       *\/      public function map(array $map, array $data): array      {          $result = [];          foreach ($map as $from =&gt; $to) {              $to = (array)$to;              if (!empty($to['param']) &amp;&amp; ($value = Arr::get($data, $to['param'])) !== null) {                  Arr::set($result, $from, $value);              } elseif ($to['value'] !== '') {                  Arr::set($result, $from, Arr::get($data, $to['value'], isset($to['value_as_param']) &amp;&amp; $to['value_as_param'] ? '' : $to['value']));              }          }            return $result;      }  <\/code><\/pre>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/512384\/\"> https:\/\/habr.com\/ru\/post\/512384\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/512384\/\">\n<p>\u0417\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442, \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0430 \u0431\u044b\u0441\u0442\u0440\u043e, \u0442.\u043a. \u043d\u0430 \u043d\u0435\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u044b \u0434\u0435\u043d\u044c\u0433\u0438, \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u044b \u0438 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0433\u0434\u0435-\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043b\u0438, \u0433\u0434\u0435-\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u043b\u0438, \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b\u0438, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435 \u0440\u0430\u0434\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0418, \u0432\u0440\u043e\u0434\u0435, \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e\u2026 <\/p>\n<p>  <\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c, \u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438. \u0417\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u044d\u0442\u043e \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u0437\u0440\u044f. <\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. \u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443 \u0437\u0430\u043f\u0438\u043b\u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 e-mail-\u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 \u00ab\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u043b \u044d\u0442\u043e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0441\u044e\u0434\u0430\u00bb. \u0418\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435, \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0442\u0438\u0440\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u043e. <\/p>\n<p>  <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/766\/967\/db9\/766967db98fb8ab7bb038e0be395f1b4.jpg\" width=\"700\" height=\"394\" alt=\"Event subsystem \/ \u041f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\"><\/p>\n<p>\u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. <\/p>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-307572","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=307572"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307572\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}