{"id":338325,"date":"2022-09-13T21:00:20","date_gmt":"2022-09-13T21:00:20","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=338325"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=338325","title":{"rendered":"<span>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u041e\u041e\u041f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u043f\u0438\u0441\u0435\u043c \u0447\u0435\u0440\u0435\u0437 Unione (php, Yii2)<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u041e\u041e\u041f \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0438\u0441\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 php. \u0421\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u041a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438\u0434\u0435\u044f, \u043d\u043e \u043d\u0430\u043c \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0435\u0449\u0451 \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0442\u0438\u043c \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u043d\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u041e\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041e\u041e\u041f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0431\u0443\u0434\u044c \u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u0435\u043c \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e. <\/p>\n<p>\u0421 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0430\u043f\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u043f\u043e <a href=\"https:\/\/docs.unione.io\/ru\/web-api-ref#email\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043f\u0440\u0438 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 (\u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Yii2, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0433\u043e (\u043a\u043e\u0434) \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0440\u0435\u0434\u0443.).<\/p>\n<pre><code class=\"php\">&lt;?php  namespace app\\jobs\\mailing;  use app\\models\\Email\\NewReserveMail;  $newReserveMail = new NewReserveMail($user->email, $subject); $res = $newReserveMail->sendMessage([$user, $investment], '\/app\/mail\/unione\/user\/letter_reserve.php');<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0432 \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0435\u043c\u0435\u0439\u043b \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 sendMessage \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u044c\u043c\u0430. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u043f\u0443\u0442\u044c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u043a\u0430\u043a \u0432 \u043d\u0451\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"php\">&lt;?php  namespace app\\models\\Email;  use app\\models\\Investment\\InvestmentReserve; use app\\models\\User\\User; use Yii;  \/**  * New investment reserve message  *  * @property-read array $properties  * @property-read array $substitutions  *\/ class NewReserveMail extends Message {     public function __construct(string $email, string $subject, bool $useTemplate = false)     {         parent::__construct($useTemplate);         $this->email    = $email;         $this->subject  = $subject;         $this->from     = Yii::$app->params['unione']['from'];         $this->sender   = Yii::$app->params['unione']['name'];         $this->template = Yii::$app->params['unione']['templates']['new_reserve']['template_id'];     }      public function getProperties(): array     {         return [             User::class => [                 'fullname' => function (User $user) {                     return $user->fullName;                 },                 'user_funds' => function (User $user) {                     $reserved = array_reduce($user->activeInvestmentReserves, function (int $sum, InvestmentReserve $reserve) {                         return $sum + $reserve->amount;                     }, 0);                     return $this->formatter->asDecimal(($user->userFunds->amount - $reserved)\/100, 2);                 }             ],             InvestmentReserve::class => [                 'amount' => function (InvestmentReserve $reserve) {                     return $this->formatter->asDecimal($reserve->amount \/ 100, 2);                 },                 'name' => function (InvestmentReserve $reserve) {                     return $reserve->project->name;                 }             ]         ];     }      \/**      * {@inheritDoc}      *\/     public function getSubstitutions(string $email = null): array     {         return [             \"Name\"            => $this->getSubstitution('fullname'),             \"Invested_amount\" => $this->getSubstitution('amount'),             \"name\"            => $this->getSubstitution('name'),             \"Account_balance\" => $this->getSubstitution('user_funds')         ];     }      public function getOptions(): array     {         return [];     } } <\/code><\/pre>\n<p>\u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442.\u043d. \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u043e\u0439\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043e\u0447\u0435\u043a {{\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430}}. \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043c\u0435\u0442\u043e\u0434\u0435 NewReserveMail::getSubstitutions \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 NewReserveMail::getProperties \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 NewReserveMail::sendMessage \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b <a href=\"https:\/\/github.com\/yiisoft\/yii2\/blob\/master\/framework\/helpers\/ArrayHelper.php\" rel=\"noopener noreferrer nofollow\">ArrayHelper::toArray<\/a>. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 NewReserveMail::getSubstitution. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, $this->getSubstitution(&#8216;fullname&#8217;) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 fullname \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 User.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0438\u0441\u0435\u043c \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0438\u0441\u0435\u043c \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u043d\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 getProperties \u0438 getSubstitutions \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 Message \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f. \u0418 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430.<\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional \/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\"> &lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">  &lt;head>   &lt;\/head>  &lt;body> &lt;p> Dear {{ Name }}, You've invested {{Invested_amount}} in the {{name}} project. Your balance is {{Account_balance}}. &lt;\/p> &lt;\/body>  &lt;\/html><\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Message \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0438 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u041e\u041e\u041f \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<pre><code class=\"php\">&lt;?php  namespace app\\models\\Email;  use app\\services\\backend\\email\\EmailServiceInterface; use app\\services\\backend\\email\\UniOneService; use Throwable; use Yii; use yii\\base\\Model; use yii\\helpers\\ArrayHelper; use yii\\httpclient\\Exception; use yii\\httpclient\\Response; use yii\\web\\View;  \/**  * @property-read array $recipients  * @property-read array $globalSubstitutions  *\/ abstract class Message extends Model {     protected array  $data;     protected $template;     protected $email;     protected $subject;     protected $from;     protected $sender;     protected $formatter;     protected $useTemplate;      \/**      * @var UniOneService      *\/     private $mailer;      \/**      * Determines properties to be extracted from input objects      * @return array      *\/     abstract public function getProperties(): array;      \/**      * Determines substitution array for unione message body      * @return array      *\/     abstract public function getSubstitutions(string $email): array;     abstract public function getOptions(): array;      \/**      * Constructor      *\/     public function __construct(bool $useTemplate)     {         parent::__construct();          $this->useTemplate = $useTemplate;          try {             $this->mailer = Yii::$container->get(EmailServiceInterface::class);             $apiKey = Yii::$app->params['unione']['apiKey'];             $baseUrl = Yii::$app->params['unione']['baseUrl'];             $this->formatter = Yii::$app->formatter;             $this->mailer->initClient($apiKey, $baseUrl);              $this->from       = Yii::$app->params['unione']['from'];             $this->sender     = Yii::$app->params['unione']['name'];         } catch (Throwable $e) {             Yii::error($e->getMessage(), 'app');         }     }      \/**      * Send message to the recipient      * @throws Exception      *\/     public function sendMessage(array $data, string $path = null): Response     {         $this->prepareData($data);          return $this->mailer->sendEmail($this->composeMessage($path));     }      \/**      * Prepares data to be input into a message      * @param $data      *\/     public function prepareData($data): void     {         $sub = ArrayHelper::toArray($data, $this->properties);         foreach ($sub as $el) {             foreach ($el as $key => $value) {                 $this->data[$key] = $value;             }         }     }      \/**      * Return ready to use array to send to the recipient      * @return array[]      *\/     public function composeMessage(string $path): array     {         $message = [             \"message\" => [                 \"recipients\" => $this->recipients,                 \"subject\"       => $this->subject,                 \"from_email\"    => $this->from,                 \"from_name\"     => $this->sender,                 'global_substitutions' => $this->getGlobalSubstitutions(),                 'options'              => $this->getOptions(), \/\/                \"skip_unsubscribe\"     => 0             ]         ];         if ($this->useTemplate) {             $message['message']['template_id'] = $this->template;          } else {             $message['message']['body'] = [                 \"html\"  => $this->render($path)             ];         }         return $message;     }      public function getRecipients(string $email = null): array     {         $recipients = [             [                 \"email\"  => $email? $email : $this->email,                 \"substitutions\" => $this->substitutions             ]         ];         return $recipients;     }      \/**      * Gets value from prepared data by the key      *\/     public function getSubstitution(string $name, string $email = null)     {         return $this->data[$name];     }      public function getGlobalSubstitution(array &amp;$data, string $name)     {         return $data[$name];     }      public function render(string  $path)     {         $view = new View();         return $view->renderFile($path, $this->getRenderVariables());     }      public function getGlobalSubstitutions(): array     {         return [];     }      public function prepareGlobalData(array $data): array     {         $sub = ArrayHelper::toArray($data, $this->globalProperties);         $subData = [];         foreach ($sub as $el) {             foreach ($el as $key => $value) {                 $subData[$key] = $value;             }         }         return $subData;     }      public function getRenderVariables(): array     {         return $this->getGlobalSubstitutions();     } } <\/code><\/pre>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0442\u0443\u0442 \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430. \u042d\u0442\u043e Message::prepareData &#8212; \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0418 \u043c\u0435\u0442\u043e\u0434 Message::composeMessage \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0435\u043b\u043e http \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. $this->mailer -\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 http \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Yii2 HttpClient\\Client \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<\/p>\n<p>\u041d\u0430\u043c\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u041e\u041f\u041f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0438\u0441\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a Unione. \u041a \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0442\u0435\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0438\u0441\u0435\u043c. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0436\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0438\u0441\u0435\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0432 \u043d\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430, \u0447\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0435\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0438 \u043f\u0440\u0438 \u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u043c \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u043f\u0438\u0441\u0435\u043c \u0434\u043b\u044f \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e \u0441 \u0430\u043f\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/688090\/\"> https:\/\/habr.com\/ru\/post\/688090\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u041e\u041e\u041f \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0438\u0441\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 php. \u0421\u0443\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u041a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438\u0434\u0435\u044f, \u043d\u043e \u043d\u0430\u043c \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0435\u0449\u0451 \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0442\u0438\u043c \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u043d\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u041e\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0441 \u0446\u0435\u043b\u044c\u044e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u041e\u041e\u041f \u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0431\u0443\u0434\u044c \u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u0435\u043c \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e. <\/p>\n<p>\u0421 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0430\u043f\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u043f\u043e <a href=\"https:\/\/docs.unione.io\/ru\/web-api-ref#email\" rel=\"noopener noreferrer nofollow\">\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043f\u0440\u0438 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 (\u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 Yii2, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0433\u043e (\u043a\u043e\u0434) \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0440\u0435\u0434\u0443.).<\/p>\n<pre><code class=\"php\">&lt;?php  namespace app\\jobs\\mailing;  use app\\models\\Email\\NewReserveMail;  $newReserveMail = new NewReserveMail($user->email, $subject); $res = $newReserveMail->sendMessage([$user, $investment], '\/app\/mail\/unione\/user\/letter_reserve.php');<\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0432 \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0435\u043c\u0435\u0439\u043b \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u043c\u0443 \u043f\u0438\u0441\u044c\u043c\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 sendMessage \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u044c\u043c\u0430. \u0412 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u043f\u0443\u0442\u044c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u043a\u0430\u043a \u0432 \u043d\u0451\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"php\">&lt;?php  namespace app\\models\\Email;  use app\\models\\Investment\\InvestmentReserve; use app\\models\\User\\User; use Yii;  \/**  * New investment reserve message  *  * @property-read array $properties  * @property-read array $substitutions  *\/ class NewReserveMail extends Message {     public function __construct(string $email, string $subject, bool $useTemplate = false)     {         parent::__construct($useTemplate);         $this->email    = $email;         $this->subject  = $subject;         $this->from     = Yii::$app->params['unione']['from'];         $this->sender   = Yii::$app->params['unione']['name'];         $this->template = Yii::$app->params['unione']['templates']['new_reserve']['template_id'];     }      public function getProperties(): array     {         return [             User::class => [                 'fullname' => function (User $user) {                     return $user->fullName;                 },                 'user_funds' => function (User $user) {                     $reserved = array_reduce($user->activeInvestmentReserves, function (int $sum, InvestmentReserve $reserve) {                         return $sum + $reserve->amount;                     }, 0);                     return $this->formatter->asDecimal(($user->userFunds->amount - $reserved)\/100, 2);                 }             ],             InvestmentReserve::class => [                 'amount' => function (InvestmentReserve $reserve) {                     return $this->formatter->asDecimal($reserve->amount \/ 100, 2);                 },                 'name' => function (InvestmentReserve $reserve) {                     return $reserve->project->name;                 }             ]         ];     }      \/**      * {@inheritDoc}      *\/     public function getSubstitutions(string $email = null): array     {         return [             \"Name\"            => $this->getSubstitution('fullname'),             \"Invested_amount\" => $this->getSubstitution('amount'),             \"name\"            => $this->getSubstitution('name'),             \"Account_balance\" => $this->getSubstitution('user_funds')         ];     }      public function getOptions(): array     {         return [];     } } <\/code><\/pre>\n<p>\u0412 \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0442.\u043d. \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0432\u043e\u0439\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043e\u0447\u0435\u043a {{\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430}}. \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043c\u0435\u0442\u043e\u0434\u0435 NewReserveMail::getSubstitutions \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 NewReserveMail::getProperties \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 NewReserveMail::sendMessage \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u044b <a href=\"https:\/\/github.com\/yiisoft\/yii2\/blob\/master\/framework\/helpers\/ArrayHelper.php\" rel=\"noopener noreferrer nofollow\">ArrayHelper::toArray<\/a>. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 NewReserveMail::getSubstitution. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, $this->getSubstitution(&#8216;fullname&#8217;) \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 fullname \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 User.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0438\u0441\u0435\u043c \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0438\u0441\u0435\u043c \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u043d\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 getProperties \u0438 getSubstitutions \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 Message \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f. \u0418 \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043b\u0430 \u043f\u0438\u0441\u044c\u043c\u0430.<\/p>\n<pre><code class=\"xml\">&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD XHTML 1.0 Transitional \/\/EN\" \"http:\/\/www.w3.org\/TR\/xhtml1\/DTD\/xhtml1-transitional.dtd\"> &lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">  &lt;head>   &lt;\/head>  &lt;body> &lt;p> Dear {{ Name }}, You've invested {{Invested_amount}} in the {{name}} project. Your balance is {{Account_balance}}. &lt;\/p> &lt;\/body>  &lt;\/html><\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Message \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0438 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u041e\u041e\u041f \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<pre><code class=\"php\">&lt;?php  namespace app\\models\\Email;  use app\\services\\backend\\email\\EmailServiceInterface; use app\\services\\backend\\email\\UniOneService; use Throwable; use Yii; use yii\\base\\Model; use yii\\helpers\\ArrayHelper; use yii\\httpclient\\Exception; use yii\\httpclient\\Response; use yii\\web\\View;  \/**  * @property-read array $recipients  * @property-read array $globalSubstitutions  *\/ abstract class Message extends Model {     protected array  $data;     protected $template;     protected $email;     protected $subject;     protected $from;     protected $sender;     protected $formatter;     protected $useTemplate;      \/**      * @var UniOneService      *\/     private $mailer;      \/**      * Determines properties to be extracted from input objects      * @return array      *\/     abstract public function getProperties(): array;      \/**      * Determines substitution array for unione message body      * @return array      *\/     abstract public function getSubstitutions(string $email): array;     abstract public function getOptions(): array;      \/**      * Constructor      *\/     public function __construct(bool $useTemplate)     {         parent::__construct();          $this->useTemplate = $useTemplate;          try {             $this->mailer = Yii::$container->get(EmailServiceInterface::class);             $apiKey = Yii::$app->params['unione']['apiKey'];             $baseUrl = Yii::$app->params['unione']['baseUrl'];             $this->formatter = Yii::$app->formatter;             $this->mailer->initClient($apiKey, $baseUrl);              $this->from       = Yii::$app->params['unione']['from'];             $this->sender     = Yii::$app->params['unione']['name'];         } catch (Throwable $e) {             Yii::error($e->getMessage(), 'app');         }     }      \/**      * Send message to the recipient      * @throws Exception      *\/     public function sendMessage(array $data, string $path = null): Response     {         $this->prepareData($data);          return $this->mailer->sendEmail($this->composeMessage($path));     }      \/**      * Prepares data to be input into a message      * @param $data      *\/     public function prepareData($data): void     {         $sub = ArrayHelper::toArray($data, $this->properties);         foreach ($sub as $el) {             foreach ($el as $key => $value) {                 $this->data[$key] = $value;             }         }     }      \/**      * Return ready to use array to send to the recipient      * @return array[]      *\/     public function composeMessage(string $path): array     {         $message = [             \"message\" => [                 \"recipients\" => $this->recipients,                 \"subject\"       => $this->subject,                 \"from_email\"    => $this->from,                 \"from_name\"     => $this->sender,                 'global_substitutions' => $this->getGlobalSubstitutions(),                 'options'              => $this->getOptions(), \/\/                \"skip_unsubscribe\"     => 0             ]         ];         if ($this->useTemplate) {             $message['message']['template_id'] = $this->template;          } else {             $message['message']['body'] = [                 \"html\"  => $this->render($path)             ];         }         return $message;     }      public function getRecipients(string $email = null): array     {         $recipients = [             [                 \"email\"  => $email? $email : $this->email,                 \"substitutions\" => $this->substitutions             ]         ];         return $recipients;     }      \/**      * Gets value from prepared data by the key      *\/     public function getSubstitution(string $name, string $email = null)     {         return $this->data[$name];     }      public function getGlobalSubstitution(array &amp;$data, string $name)     {         return $data[$name];     }      public function render(string  $path)     {         $view = new View();         return $view->renderFile($path, $this->getRenderVariables());     }      public function getGlobalSubstitutions(): array     {         return [];     }      public function prepareGlobalData(array $data): array     {         $sub = ArrayHelper::toArray($data, $this->globalProperties);         $subData = [];         foreach ($sub as $el) {             foreach ($el as $key => $value) {                 $subData[$key] = $value;             }         }         return $subData;     }      public function getRenderVariables(): array     {         return $this->getGlobalSubstitutions();     } } <\/code><\/pre>\n<p>\u0421\u043e\u0431<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-338325","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338325","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=338325"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338325\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=338325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=338325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=338325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}