Eloquent рд╕рд╣ рдЙрдкрдпреБрдХреНрдд рднрд╛рдВрдбрд╛рд░?

рдЧреЗрд▓реНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдд рдореА рд▓рд┐рд╣рд┐рд▓реЗ Eloquent рд╕рдВрд╕реНрдерд╛рдВрд╕рд╛рдареА рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдЯреЗрдореНрдкрд▓реЗрдЯрдЪреНрдпрд╛ рдирд┐рд░реБрдкрдпреЛрдЧреАрдкрдгрд╛рдмрджреНрджрд▓ рд▓реЗрдЦ, рддрдерд╛рдкрд┐, рддреНрдпрд╛рдиреЗ рдЕрдВрд╢рддрдГ рддреНрдпрд╛рдЪреНрдпрд╛ рдлрд╛рдпрджреНрдпрд╛рд╕рд╛рдареА рддреЗ рдХрд╕реЗ рд╡рд╛рдкрд░рд╛рд╡реЗ рд╣реЗ рд╕рд╛рдВрдЧрдгреНрдпрд╛рдЪреЗ рд╡рдЪрди рджрд┐рд▓реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореА рд╣реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╣рд╕рд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдордзреНрдпреЗ рдХрд╕реЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ рдпрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди. рднрд╛рдВрдбрд╛рд░рд╛рд╕рд╛рдареА рдХрд┐рдорд╛рди рдЖрд╡рд╢реНрдпрдХ рдкрджреНрдзрддреАрдВрдЪрд╛ рд╕рдВрдЪ:

<?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, рд╕рдВрд╕реНрдерд╛ рд╣рд╛рддрд╛рд│рдгреА рдЖрдгрд┐ рд╕рдордиреНрд╕рд┐рдВрдЧ рдкреЛрд╕реНрдЯрд░рд┐рдкреЙрдЬрд┐рдЯрд░реА::рд╕реЗрд╡реНрд╣ рдХрд░рд╛
  • рдПрдХ рдЖрд╡реНрд╣рд╛рди PostRepository::delete

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

рд╡рд╛рдЪрд▓реЗрд▓рд╛ рднрд╛рдЧ рдорд▓рд╛ рддрд┐рддрдХрд╛рд╕рд╛ рдирд┐рд░реБрдкрдпреЛрдЧреА рд╡рд╛рдЯрдд рдирд╛рд╣реА, рдХрд╛рд░рдг Eloquent рд╕рд╛рдареА рджреЗрдЦреАрд▓ рдпреЗрдереЗ рдЕрдиреЗрдХ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЕрд╕реВ рд╢рдХрддрд╛рдд. рд╡рд░реНрдЧрд╛рд▓рд╛ рдХрд╛рдп рдирд╛рд╡ рджреНрдпрд╛рд╡реЗ? рдХрд░реВ рд╢рдХрддреЛ 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();
    }
}

рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдордзреНрдпреЗ 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(),
        ]);
    }
} 

рдкрджреНрдзрдд PostsController::lastPosts рдлрдХреНрдд рдХрд╛рд╣реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА рд╡рд┐рдЪрд╛рд░рдд рдЖрд╣реЗ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реА рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдЖрдореНрд╣реА рд▓рд┐рдВрдХ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рджрд╛рддрд╛ рдордзреНрдпреЗ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реА рд╡рд░реНрдЧрд╛рд╕рд╣ рд╡рд╛рдХрдмрдЧрд╛рд░ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реА рдЖрдгрд┐ рд╣рд╛ рд╡рд░реНрдЧ рдХрдВрдЯреНрд░реЛрд▓рд░рдордзреНрдпреЗ рдмрджрд▓рд▓рд╛ рдЬрд╛рдИрд▓.

рдЪрд▓рд╛ рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛ рдХреА рдЖрдордЪрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЦреВрдк рд▓реЛрдХрдкреНрд░рд┐рдп рдЭрд╛рд▓рд╛ рдЖрд╣реЗ. рдкреНрд░рддрд┐ рдорд┐рдирд┐рдЯ рд╣рдЬрд╛рд░реЛ рд╡рд╛рдкрд░рдХрд░реНрддреЗ рдирд╡реАрдирддрдо рдкреНрд░рдХрд╛рд╢рдирд╛рдВрд╕рд╣ рдкреГрд╖реНрда рдЙрдШрдбрддрд╛рдд. рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд╢рдиреЗ рджреЗрдЦреАрд▓ рдЦреВрдк рд╡реЗрд│рд╛ рд╡рд╛рдЪрд▓реА рдЬрд╛рддрд╛рдд. рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрд╕реЗ рднрд╛рд░ рдлрд╛рд░ рдЪрд╛рдВрдЧрд▓реЗ рд╣рд╛рддрд╛рд│рдд рдирд╛рд╣реАрдд, рдореНрд╣рдгреВрди рддреЗ рдПрдХ рдорд╛рдирдХ рдЙрдкрд╛рдп рд╡рд╛рдкрд░рддрд╛рдд - рдПрдХ рдХреЕрд╢реЗ. рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрд╢рдиреНрд╕рд╕рд╛рдареА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕реНрдЯреЛрд░реЗрдЬрдордзреНрдпреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рд╕реНрдиреЕрдкрд╢реЙрдЯ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ - memcached рдХрд┐рдВрд╡рд╛ рд░реЗрдбрд┐рд╕.

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

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

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

рдЗрдВрдЯрд░рдлреЗрд╕рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░рд╛ рднрд╛рдВрдбрд╛рд░ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдордзреНрдпреЗ. рдХрд╛рд╣реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рддреНрдпрд╛рдВрдиреА Laravel рдордзреНрдпреЗ рдХреЕрд╢рд┐рдВрдЧрд╕рд╛рдареА рдЗрдВрдЯрд░рдлреЗрд╕рд▓рд╛ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдирд╛рд╡ рджреЗрдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛.

рдХреНрд▓реЛрд╕реНрд╕ рдХреЕрд╢реЗрдбрдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬ рдлрдХреНрдд рдХреЕрд╢рд┐рдВрдЧрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рддреЗ. $this->cache->рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рд╣реА рдиреЛрдВрдж рдХреЕрд╢реЗрдордзреНрдпреЗ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рддреЗ рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рдирд╕рд▓реНрдпрд╛рд╕, рдХреЙрд▓рдмреЕрдХ рдХреЙрд▓ рдХрд░рддреЗ рдЖрдгрд┐ рдХреЕрд╢реЗрдордзреНрдпреЗ рдкрд░рдд рдХреЗрд▓реЗрд▓реЗ рдореВрд▓реНрдп рд▓рд┐рд╣рд┐рддреЗ. рдпрд╛ рд╡рд░реНрдЧрд╛рдЪреА рдНрдкреНрд▓рд┐рдХреЗрд╢рдирдордзреНрдпреЗ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреЗ рдПрд╡рдвреЗрдЪ рдЙрд░рд▓реЗ рдЖрд╣реЗ. рдЗрдВрдЯрд░рдлреЗрд╕рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рд╡рд┐рдирдВрддреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреАрд▓ рд╕рд░реНрд╡ рд╡рд░реНрдЧрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реА рд╡рд░реНрдЧрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдорд┐рд│реВ рд▓рд╛рдЧрд▓реЗ рдХреЕрд╢реЗрдбрдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬ. рдорд╛рддреНрд░, рддреНрдпрд╛рдВрдиреА рд╕реНрд╡ рдХреЕрд╢реЗрдбрдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдЬ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рд▓рд╛ рдкреЕрд░рд╛рдореАрдЯрд░ рдореНрд╣рдгреВрди рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рд╡рд╛рдХрдмрдЧрд╛рд░ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрдХрд╛рд░рдг рддреЗ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╢рд┐рд╡рд╛рдп рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. рдЖрдореНрд╣реА рдмрджрд▓рддреЛ 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) рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реНрддрд░рд╛рд╡рд░ рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕ рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реЗ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрд╣реЗ. рджреНрд╡рд╛рд░реЗ рдореА рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рдЖрд▓реЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреГрдердХреНрдХрд░рдг рддрддреНрддреНрд╡, рдЬреЗ рд╕реБрдЪрд╡рд┐рддреЗ рдХреА рдореА рдХреБрд╢рд▓рддреЗрдиреЗ рдирдореБрдиреЗ рдЖрдгрд┐ рддрддреНрддреНрд╡реЗ рд╣рд╛рддрд╛рд│рддреЛ рдЖрдгрд┐ рдПрдХ рдкреНрд░рдореЗрдп рдореНрд╣рдгреВрди рджреБрд╕рд▒реНрдпрд╛рдордзреВрди рдХрд╛рдврддреЛ :) рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд▓реНрдкрд╛рд▓рд╛ рдШрдЯрдХ рдирд┐рд╡рдбрдгреНрдпрд╛рд╕рд╛рдареА рдЕрд╢рд╛ рдЕрдореВрд░реНрддрддреЗрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╕рддреЗ, рдкрд░рдВрддреБ рдореА рдпреБрдХреНрддреА рддреБрдордЪреНрдпрд╛рдмрд░реЛрдмрд░ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░реЗрди. рдЕрд░реНрдЬрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░ рд╡рд┐рдХрд╛рд╕, рдЖрдкрдг рдлрдХреНрдд рдПрдХ рд╡рд░реНрдЧ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реА Eloquent рджреНрд╡рд╛рд░реЗ рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╣:

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

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

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

рдпрд╛ рд╕рд░реНрд╡ рдпреБрдХреНрддреНрдпрд╛ рд╡рд░реНрдЧ, рдЗрдВрдЯрд░рдлреЗрд╕, рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рдЗрдВрдЬреЗрдХреНрд╢рди ╨╕ CQRS рдордзреНрдпреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗ рдЖрд╣реЗ рдорд╛рдЭреЗ рдкреБрд╕реНрддрдХ "рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдСрдл рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рд╡реЗрдм рдНрдкреНрд▓рд┐рдХреЗрд╢рди". рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ рдорд╛рдЭреЗ рд╕рд░реНрд╡ рд╡рд░реНрдЧ рдЕрдВрддрд┐рдо рдХрд╛ рдореНрд╣рдгреВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд рдпрд╛ рдХреЛрдбреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рджреЗрдЦреАрд▓ рдЖрд╣реЗ.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛