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

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

<?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::getById, рдЗрдХрд╛рдИ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдФрд░ рд╕рдореНрдорди рдкреЛрд╕реНрдЯрд░рд┐рдкреЛрдЬрд┐рдЯрд░реА::рд╕рд╣реЗрдЬреЗрдВ
  • рдХреЙрд▓ рдкреЛрд╕реНрдЯрд░рд┐рдкреЛрдЬрд┐рдЯрд░реА::рд╣рдЯрд╛рдПрдБ

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

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

<?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();
    }
}

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╕рдВрдмрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдРрдк рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛:

<?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(),
        ]);
    }
} 

рд╡рд┐рдзрд┐ рдкреЛрд╕реНрдЯрдХрдВрдЯреНрд░реЛрд▓рд░::рдЕрдВрддрд┐рдордкреЛрд╕реНрдЯ рдмрд╕ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдБ рдкреЛрд╕реНрдЯ рдкреНрд░рд╢реНрди рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ. рдЬрд┐рд╕ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рд╣рдордиреЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬрд╝ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдПрд▓реЛрдХреНрд╡реЗрдВрдЯрдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬрд╝ рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

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

<?php
use IlluminateContractsCacheRepository;

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();
            });
    }

    // ╨┤╤А╤Г╨│╨╕╨╡ ╨╝╨╡╤В╨╛╨┤╤Л ╨┐╤А╨░╨║╤В╨╕╤З╨╡╤Б╨║╨╕ ╤В╨░╨║╨╕╨╡ ╨╢╨╡
}

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

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

<?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);
    }
}

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

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

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

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

    // ╨┤╤А╤Г╨│╨╕╨╡ ╨╝╨╡╤В╨╛╨┤╤Л
}

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

рдХрдХреНрд╖рд╛рдУрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдпреЗ рд╕рднреА рддрд░рдХреАрдмреЗрдВ, рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреНрддрдГрдХреНрд╖реЗрдкрдг ╨╕ рд╕реАрдХреНрдпреВрдЖрд░рдПрд╕ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ рдореЗрд░реА рдкреБрд╕реНрддрдХ "рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░". рдЗрд╕ рдкрд╣реЗрд▓реА рдХрд╛ рднреА рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдореЗрд░реА рд╕рднреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЕрдВрддрд┐рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ