PHP microservice рдлреНрд░реЗрдорд╡рд░реНрдХ

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

рдЬрдм рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рдореИрдВрдиреЗ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдХрд┐:

  • рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  • рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  • рд╕рдмрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдбрд┐рдЬрд╛рдЗрди;
  • рдЖрдзреБрдирд┐рдХ PHP рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреЛ рдЖрдк рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ рд╕реНрд░реЛрдд рд╕реЗ! рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЧрд┐рддреБрдм рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдЦреИрд░, рд▓рдВрдмреА рдмрд╣рд╕ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ .htaccess рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ:

# use mod_rewrite for pretty URL support RewriteEngine on RewriteRule ^([a-z0-9A-Z_\/\.\-\@%\ :,]+)/?(.*)$ index.php?r=$1&%{QUERY_STRING} [L] RewriteRule ^/?(.*)$ index.php?r=index&%{QUERY_STRING} [L] 

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

 require_once ('vendor/service/service.php'); 

рддрдм рд╣рдо рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ:

 class TodoService extends ServiceBase implements ServiceBaseLogicInterface { /* class body */ } 

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

  • ServiceBase рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдФрд░ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ;
  • ServiceBaseLogicInterface рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЗ рд╡рд░реНрдЧ рдкрд░ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИред рдмрд╕ рдЕрдзрд┐рдХ рдХрдбрд╝реЗ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рддрдм рд╣рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИрдВрдбрд▓рд░ рдорд┐рд▓рддрд╛ рд╣реИ:

 public function action_ping() { return ('I am alive!'); } 

рдлрд┐рд░ рд╣рдордиреЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛:

 Service::start('TodoService'); 

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдХрд░, рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:

 /** * Service class */ class TodoService extends ServiceBase implements ServiceBaseLogicInterface { /** * First endpoint */ public function action_ping() { return ('I am alive!'); } } Service::start('TodoService'); 

рдПрдХ рдЙрдЪрд┐рдд рд╕рд╡рд╛рд▓ рдЙрда рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рдХрд┐рд╕ URL рдкрд░ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХреНрд╢рди_ <name-part> рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ, рдЖрдкрдиреЗ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ URL рд╣реИрдВрдбрд▓рд░ рд╣реИ <name-part> рдЕрд░реНрдерд╛рддред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ / рдкрд┐рдВрдЧ рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛
рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдкрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ -ред рдпрд╛рдиреА рдПрдХреНрд╢рди_рд╣реЗрд▓реНрд▓реЛ_рд╡рд░реНрд▓реНрдб рд╡рд┐рдзрд┐ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ / рд╣реЗрд▓реЛ-рд╡рд░реНрд▓реНрдб рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреА

рд╣рдордиреЗ рдзрд░рдирд╛ рджрд┐рдпрд╛ред

GUI рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ MVC (рдпрд╛ рджреГрд╢реНрдп рдШрдЯрдХ рдФрд░ рддрд░реНрдХ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдкреИрдЯрд░реНрди), рд╕рд╛рде рд╣реА рд╕рд╛рде microservice рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХреЛ рддреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рддреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╛рдиреА рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдХреЛ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╣реИрдВрдбрд▓рд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 class TodoLogic extends ServiceBaseLogic { /** * First endpoint */ public function action_ping() { return ('I am alive!'); } } class TodoService extends ServiceBase { } Service::start('TodoService', 'TodoLogic'); 

рдлрд┐рд░ рд╣рдореЗрдВ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдорд┐рд▓рд╛:

 class TodoLogic extends ServiceBaseLogic 

рдмреЗрд╕ рдХреНрд▓рд╛рд╕ ServiceBaseLogic рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХреА рдЧрдИ (рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗ)ред

TodoService рд╡рд░реНрдЧ ServiceBaseLogicInterface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдпрд╣ рдЕрднреА ServiceBaseLogic рд╡рд░реНрдЧ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ)ред

рддрд░реНрдХ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдЯреЛрдбреЛ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдЦрд╛рд▓реА рд╣реЛ рдЧрдпрд╛ рдФрд░ рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдФрд░ рднреА рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛:

 class TodoLogic extends ServiceBaseLogic { /** * First endpoint */ public function action_ping() { return ('I am alive!'); } } Service::start('ServiceBase', 'TodoLogic'); 

рдпрд╣рд╛рдБ, ServiceBase рд╡рд░реНрдЧ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╣рдорд╛рд░рд╛ рдирд╣реАрдВред

рд╣рдордиреЗ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ред

рдореЗрд░реЗ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░, рд░рд╛рдХреНрд╖рд╕реА рдЖрдХрд╛рд░ рдХреЗ рддрд░реНрдХ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВ рдирд┐рдХрд▓рдирд╛ рд╢реБрд░реВ рд╣реБрдИрдВред рдХреНрдпрд╛ рдПрдХ рдУрд░ рдореЗрд░реА рд╕реБрдВрджрд░рддрд╛ рдХреА рдЪрд┐рдврд╝ рдереА, рджреВрд╕рд░реА рдУрд░, рд╕реЛрдирд╛рд░ рдирд┐рд░рдВрдХреБрд╢ рдереЗ, рддреАрд╕рд░реА рдУрд░, рддрд░реАрдХреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рд▓реЗрдЦрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ (рд╕реАрдХреНрдпреВрдЖрд░рдПрд╕ рджреЗрдЦреЗрдВ) рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░, рддрд░реНрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдореВрд╣ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╕реЗрд╡рд╛ рдХреЗ рднреАрддрд░ рдЪрд▓рд╛рдПрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВред

рдпрд╛рдиреА рдЖрдк рдпрд╛ рддреЛ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рднреАрддрд░ рд╕рднреА CRUD рддрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реЗ рджреЛ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рдПрдХ рдкрдврд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ;
  • рдФрд░ рджреВрд╕рд░рд╛ рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрди рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рдЕрдм рдПрдХ рдЗрдХрд╛рдИ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдФрд░ рдПрдХ рдЗрдХрд╛рдИ рд╕реВрдЪреА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 class TodoSystemLogic extends ServiceBaseLogic { public function action_ping() { return ('I am alive!'); } } /** * Read logic implementation */ class TodoReadLogic extends ServiceBaseLogic { public function action_list() { return ('List!'); } } /** * Write logic implementation */ class TodoWriteLogic extends ServiceBaseLogic { public function action_create() { return ('Done!'); } } Service::start('ServiceBase', [ 'TodoSystemLogic', 'TodoReadLogic', 'TodoWriteLogic' ]); 

рд╣рдо рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВрдЧреЗ:

  • рдХрдХреНрд╖рд╛рдПрдВ рдЯреЛрдбрд╕рд┐рд╕реНрдЯрдорд▓реЛрдЧрд┐рдХ (рд╕рд┐рд╕реНрдЯрдо рдореЗрдердб), рдЯреЛрдбреЛрдПрдбрд▓реЛрдЬрд┐рдХ (рдкрдврд╝реА рдЧрдИ рд╡рд┐рдзрд┐рдпрд╛рдБ), рдЯреЛрдбреЛрд╡рд░реНрдерд▓реЛрдЧрд┐рдХ (рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ) рджрд┐рдЦрд╛рдИ рджрд┐рдП;
  • рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИред

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

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


All Articles