рдПрд▓реЛрдХреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА?

рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ, рдореИрдВрдиреЗ рдПрд▓реЛрдХреЗрдВрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдмреЗрдХрд╛рд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдн рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдорддреМрд░ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рд╡рд┐рдзрд┐:


<?php interface PostRepository { public function getById($id): Post; public function save(Post $post); public function delete($id); } 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдпрджрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╡реЗ рдЕрдХреНрд╕рд░ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


 <?php interface PostRepository { public function getById($id): Post; public function save(Post $post); public function delete($id); public function getLastPosts(); public function getTopPosts(); public function getUserPosts($userId); } 

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


рдорд╛рдирдХ рд▓реЗрдЦрди рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВ:


  • рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ PostRepository рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ :: рд╕рд╣реЗрдЬреЗрдВ
  • PostRepository :: getById , рдЗрдХрд╛рдИ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдФрд░ PostRepository :: save
  • рдХреЙрд▓ PostRepository :: рд╣рдЯрд╛рдПрдВ

рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдХреЛрдИ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВред рд░реАрдб рдСрдкрд░реЗрд╢рдВрд╕ рдореЗрдВ, рдХреЗрд╡рд▓ * рдореЗрдердбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрд▓рдЧрд╛рд╡ рд╕рд┐рджреНрдзрд╛рдВрдд ( SOLID рдореЗрдВ рдкрддреНрд░ I ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдХрдо рд╕реЗ рдХрдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рджреЛрдиреЛрдВ рдореЗрдВ GetById рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡реЗрджрди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рдпрд╣ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рджреЗрдЦреЗрдВрдЧреЗред рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреА рдмреЗрдХрд╛рд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реВрдВред


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЗрддрдирд╛ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрд▓реЛрдХреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рднреА рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рдХреИрд╕реЗ рд░рдЦреЗрдВ? рдЖрдк рд░реАрдбрдкреЛрд╕реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╕рдВрдмрдВрдз рд╣реИред рдЖрдк рдмрд╕ PostQueries рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 <?php interface PostQueries { public function getById($id): Post; public function getLastPosts(); public function getTopPosts(); public function getUserPosts($userId); } 

рдПрд▓реЛрдХреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:


 <?php final class EloquentPostQueries implements PostQueries { public function getById($id): Post { return Post::findOrFail($id); } /** * @return Post[] | Collection */ public function getLastPosts() { return Post::orderBy('created_at', 'desc') ->limit(/*some limit*/) ->get(); } /** * @return Post[] | Collection */ public function getTopPosts() { return Post::orderBy('rating', 'desc') ->limit(/*some limit*/) ->get(); } /** * @param int $userId * @return Post[] | Collection */ public function getUserPosts($userId) { return Post::whereUserId($userId) ->orderBy('created_at', 'desc') ->get(); } } 

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AppServiceProvider рдореЗрдВ :


 <?php final class AppServiceProvider extends ServiceProvider { public function register() { $this->app->bind(PostQueries::class, EloquentPostQueries::class); } } 

рдпрд╣ рд╡рд░реНрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧреА рд╣реИред рд╡рд╣ рдпрд╛ рддреЛ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдпрд╛ рдПрдХ рдЗрдХрд╛рдИ рд╡рд░реНрдЧ рдХреЛ рдЙрддрд╛рд░рдХрд░ рдЕрдкрдиреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 <?php final class PostsController extends Controller { public function lastPosts(PostQueries $postQueries) { return view('posts.last', [ 'posts' => $postQueries->getLastPosts(), ]); } } 

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


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддрд┐ рдорд┐рдирдЯ рд╣рдЬрд╛рд░реЛрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╡реАрдирддрдо рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдЦреЛрд▓рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд╢рди рднреА рдЕрдХреНрд╕рд░ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рдРрд╕реЗ рднрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди - рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд▓рд╛ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реИ - рдореЗрдордХрд╛рдЯреЗрдб рдпрд╛ рд░реЗрдбрд┐рд╕ ред


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


 <?php use Illuminate\Contracts\Cache\Repository; final class CachedPostQueries implements PostQueries { const LASTS_DURATION = 10; /** @var PostQueries */ private $base; /** @var Repository */ private $cache; public function __construct( PostQueries $base, Repository $cache) { $this->base = $base; $this->cache = $cache; } /** * @return Post[] | Collection */ public function getLastPosts() { return $this->cache->remember('last_posts', self::LASTS_DURATION, function(){ return $this->base->getLastPosts(); }); } //      } 

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


рдХреИрд╢реНрдбрдкреЛрд╕реНрдЯрдХреНрд╡рд╛рдпрд░реАрдЬ рд╡рд░реНрдЧ рдХреЗрд╡рд▓ рдХреИрд╢рд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред $ рдпрд╣-> рдХреИрд╢-> рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рджреА рдЧрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреИрд╢ рдореЗрдВ рд╣реИ рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдХреИрд╢ рдХреЛ рд▓реМрдЯрд╛ рдореВрд▓реНрдп рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╣рдореЗрдВ рдЙрди рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреИрд╢реНрдбрдкреЛрд╕реНрдЯрдХреНрд╡рд╛рдпрд░реАрдЬ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬрд╝ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреВрдЫрддреЗ рд╣реИрдВ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреИрд╢реНрдбрдкреЛрд╕реНрдЯрдХреНрд╡рд╛рдпрд░реАрдЬ рдХреЛ рдЦреБрдж рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрд▓реЛрдХреНрд╡реЗрдВрдЯрдкреЛрд╕реНрдЯрдХреНрд╡рд╛рдпрд░реАрдЬ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред AppServiceProvider рдмрджрд▓реЗрдВ:


 <?php final class AppServiceProvider extends ServiceProvider { public function register() { $this->app->bind(PostQueries::class, CachedPostQueries::class); $this->app->when(CachedPostQueries::class) ->needs(PostQueries::class) ->give(EloquentPostQueries::class); } } 

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


рдмреЗрд╢рдХ, рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЕрдорд╛рдиреНрдпрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╣рдЯрд╛рдП рдЧрдП рд▓реЗрдЦ рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рдФрд░ рд╕рдордп рдХреЗ рд▓рд┐рдП рд▓рдЯрдХрд╛ рди рд╣реЛ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ (рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред


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


 <?php final class PostQueries { public function getById($id): Post { return Post::findOrFail($id); } //   } 

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


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдорд╛рди рдкреЛрд╕реНрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ CQRS рдирд╣реАрдВ рд╣реИред



рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬрд╝ рд╕реЗ рдкреЛрд╕реНрдЯ рдЗрдХрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд░рд▓ -> рд╕рд╣реЗрдЬреЗрдВ () рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬреЗрдВ ред рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж, рдЯреАрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдорд╛рд╕реНрдЯрд░-рд╕реНрд▓реЗрд╡ рдкреНрд░рддрд┐рдХреГрддрд┐ рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреА рдФрд░ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬрд╝ рд░реАрдб- рд░реЗрдкреНрд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧреАред рдкрдврд╝реА рдЧрдИ рдкреНрд░рддрд┐рдХреГрддрд┐рдпреЛрдВ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЖрдорддреМрд░ рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдЦреБрд▓ рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕реЗ рд╕рднреА рдЬрд╛рдо рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреА рд╣реЛрдЧреАред


рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред рдЖрдк рдПрд▓реЛрдХреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдХрд░ред рдЙрджрд╛рд╣рд░рдг: https://github.com/adelf/freelance-example/blob/master/app/ReadModels/ReadModel.php рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрди рд╕рдВрдЪрд╛рд▓рди рдЕрд╡рд░реБрджреНрдз рд╣реИрдВред рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдмрдирд╛рдПрдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ReadPost (рдЖрдк рдкреЛрд╕реНрдЯ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдорд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ):


 <?php final class ReadPost extends ReadModel { protected $table = 'posts'; } interface PostQueries { public function getById($id): ReadPost; } 

рдРрд╕реЗ рдореЙрдбрд▓ рдХреЛ рдХреЗрд╡рд▓ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк: рдПрд▓реЛрдХреЗрдВрдЯ рдХреЛ рддреНрдпрд╛рдЧ рджреЗрдВред рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:


  • рд╕рднреА рддрд╛рд▓рд┐рдХрд╛ рдлрд╝реАрд▓реНрдб рд▓рдЧрднрдЧ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред LastPosts рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЖрдИрдбреА , рд╢реАрд░реНрд╖рдХ рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд╢рд┐рдд_рдЯ рдлрд╝реАрд▓реНрдб рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреЗ рдХреБрдЫ рднрд╛рд░реА рдкрд╛рдареЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рдХреИрд╢ рдкрд░ рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рднрд╛рд░ рджреЗрдЧрд╛ред рд╡рд╛рдХреНрдкрдЯреБ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдмрд╣реБрдд рдирд┐рд╣рд┐рдд рд╣реИред рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬрд╝ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рдЪреБрдиреЗ рдЧрдП рд╣реИрдВред
  • рдХреИрд╢рд┐рдВрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреНрд░рдордмрджреНрдз рд░реВрдк рдореЗрдВ рд╕реБрдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рдЬрд╛рддреА рд╣реИ (рдЖрдк рдХреИрд╢ рд╕реЗ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдЖрдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ?)ред рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХреИрд╢ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдиреЗ рдПрд▓реЛрдХреЗрдВрдЯ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10 рдЧреБрдирд╛ рдХрдо рдЬрдЧрд╣ рд▓реА (рдмрд╣реБрдд рдЫреЛрдЯреА рдЙрдк-рдиреГрддрд┐рдпрд╛рдВ рдереАрдВ)ред рдХреИрд╢рд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:


 <?php final class PostHeader { public int $id; public string $title; public DateTime $publishedAt; } final class Post { public int $id; public string $title; public string $text; public DateTime $publishedAt; } interface PostQueries { public function getById($id): Post; /** * @return PostHeader[] */ public function getLastPosts(); /** * @return PostHeader[] */ public function getTopPosts(); /** * @var int $userId * @return PostHeader[] */ public function getUserPosts($userId); } 

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

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


All Articles