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

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

рдорд╛рдирдХ рд▓реЗрдЦрди рдХрд╛рд░реНрдп рд╣реЛ:

  • рдирдпрд╛рдБ рд╡рд╕реНрддреБ рд░ рдЪреБрдиреМрддреА рдХреЛ рдирд┐рд░реНрдорд╛рдг PostRepository ::рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • PostRepository::getById, рд╕рдВрд╕реНрдерд╛ рд╣реЗрд░рдлреЗрд░ рд░ рдЖрд╣реНрд╡рд╛рди PostRepository ::рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдПрдЙрдЯрд╛ рдЪреБрдиреМрддреА PostRepository::delete

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

рдкрдврд┐рдПрдХреЛ рднрд╛рдЧ рдорд▓рд╛рдИ рддреНрдпрддрд┐ рдмреЗрдХрд╛рд░ рдЫреИрди рдЬрд╕реНрддреЛ рд▓рд╛рдЧреНрдЫ, рдХрд┐рдирдХрд┐ Eloquent рдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдпрд╣рд╛рдБ рдзреЗрд░реИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реБрди рд╕рдХреНрдЫред рдХрдХреНрд╖рд╛рд▓рд╛рдИ рдХреЗ рдирд╛рдо рджрд┐рдиреЗ ? рд╕рдХреНрдЫ ReadPostRepository, рддрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯрдорд╛ рднрдгреНрдбрд╛рд░ рдЙрд╣рд╛рдБрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ рдХрдо рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдЫред рддрдкрд╛рдИрдВ рдорд╛рддреНрд░ рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрд╣рд░реВ:

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

Eloquent рдХреЛ рд╕рд╛рде рд▓рд╛рдЧреВ рдЧрд░реНрдиреБ рдПрдХрджрдо рд╕рд░рд▓ рдЫ:

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

рд╡рд┐рдзрд┐ рдкреЛрд╖реНрдЯрдХрдиреНрдЯреНрд░реЛрд▓рд░::рдЕрдиреНрддрд┐рдо рдкреЛрд╖реНрдЯрд╣рд░реВ рдХреЗрд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдорд╛рдЧ рдорд╛рддреНрд░реИ рд╣реЛ рдкреЛрд╖реНрдЯ рдкреНрд░рд╢реНрдирд╣рд░реВ рд░ рдпрд╕рдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрджрдЫред рдкреНрд░рджрд╛рдпрдХрдорд╛ рд╣рд╛рдореАрд▓реЗ рд▓рд┐рдЩреНрдХ рдЧрд░реЗрдХрд╛ рдЫреМрдВ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрд╣рд░реВ рдХрдХреНрд╖рд╛ рд╕рдВрдЧ EloquentPostQuerys рд░ рдпреЛ рд╡рд░реНрдЧ рдирд┐рдпрдиреНрддреНрд░рдХ рдорд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░рд┐рдиреЗрдЫред

рд╣рд╛рдореНрд░реЛ рдЖрд╡реЗрджрди рдзреЗрд░реИ рд▓реЛрдХрдкреНрд░рд┐рдп рднрдПрдХреЛ рдЫ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдЧрд░реМрдВред рдкреНрд░рддрд┐ рдорд┐рдиреЗрдЯ рд╣рдЬрд╛рд░реМрдВ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдирд╡реАрдирддрдо рдкреНрд░рдХрд╛рд╢рдирд╣рд░реВрдХреЛ рд╕рд╛рде рдкреГрд╖реНрда рдЦреЛрд▓реНрдЫрдиреНред рд╕рдмреИрднрдиреНрджрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рдХрд╛рд╢рдирд╣рд░реВ рдкрдирд┐ рдзреЗрд░реИ рдкрдЯрдХ рдкрдврд┐рдиреНрдЫред рдбрд╛рдЯрд╛рдмреЗрд╕рд╣рд░реВрд▓реЗ рддреНрдпрд╕реНрддрд╛ рднрд╛рд░рд╣рд░реВ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрджреИрдирдиреН, рддреНрдпрд╕реИрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫрдиреН - рдХреНрдпрд╛рд╕ред рдбрд╛рдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд╛рдЯрд╛ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рдХреЗрд╣рд┐ рдЕрдкрд░реЗрд╢рдирд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рдЕрдиреБрдХреВрд▓рд┐рдд рднрдгреНрдбрд╛рд░рдг рдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫ - 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 рдорд╛ рдХреНрдпрд╛рд╕рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдирд╛рдо рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗред

╨Ъ╨╗╨░╤Б╤Б CachedPostQuerys рдХреНрдпрд╛рд╕рд┐рдЩ рдорд╛рддреНрд░ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред $this->cache-> рд╕рдореНрдЭрдиреБрд╣реЛрд╕реН рдпреЛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреНрдпрд╛рд╕рдорд╛ рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рд░ рдпрджрд┐ рд╣реЛрдЗрди рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдХрд▓рдмреНрдпрд╛рдХрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдЫ рд░ рдХреНрдпрд╛рд╕рдорд╛ рдлрд░реНрдХрд╛рдЗрдПрдХреЛ рдорд╛рди рд▓реЗрдЦреНрдЫред рдмрд╛рдБрдХреА рд╕рдмреИ рдпреЛ рд╡рд░реНрдЧрд▓рд╛рдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╣реЛред рд╣рд╛рдореАрд▓рд╛рдИ рдЗрдиреНрдЯрд░рдлреЗрд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрд░реЛрдз рдЧрд░реНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рд╕рдмреИ рдХрдХреНрд╖рд╛рд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ рдкреЛрд╕реНрдЯрдХреНрд╡реЗрд░реАрд╣рд░реВ рдХрдХреНрд╖рд╛рдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдерд╛рд▓реЗ CachedPostQuerysред рддрд░, рдЙрдиреА рд╕реНрд╡ CachedPostQuerys рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рд▓реЗ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдХреЛ рд░реВрдкрдорд╛ рдХреНрд▓рд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрдкрд░реНрдЫ EloquentPostQuerysрдХрд┐рдирдХрд┐ рдпреЛ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд┐рдирд╛ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрджреИрдиред рд╣рд╛рдореА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдЫреМрдВ 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);
    }

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

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди