เดŽเดฒเต‹เด•เตเดตเดจเตเดฑเดฟเดจเตŠเดชเตเดชเด‚ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดถเต‡เด–เดฐเดฃเด™เตเด™เตพ?

เด•เดดเดฟเดžเตเดž เด†เดดเตเดš เดžเดพเตป เดŽเดดเตเดคเดฟ เดŽเดฒเต‹เด•เตเดตเดจเตเดฑเต เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเดฟเดจเตเดฑเต† เด‰เดชเดฏเต‹เด—เดถเต‚เดจเตเดฏเดคเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฒเต‡เด–เดจเด‚, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดคเดจเตเดฑเต† เดจเต‡เดŸเตเดŸเดคเตเดคเดฟเดจเดพเดฏเดฟ เด‡เดคเต เดŽเด™เตเด™เดจเต† เดญเดพเด—เดฟเด•เดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดŽเดจเตเดจเต‹เดŸเต เดชเดฑเดฏเดพเดฎเต†เดจเตเดจเต เด…เดฆเตเดฆเต‡เดนเด‚ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดคเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดˆ เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เดณเดฟเตฝ เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเด‚. เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดฐเต€เดคเดฟเด•เตพ:

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

เดˆ เดฐเต€เดคเดฟเด•เตพ เดŽเดฒเต‹เด•เตเดตเดจเตเดฑเต เดธเตโ€Œเด•เต‹เดชเตเดชเตเด•เดณเดฟเดฒเต‚เดŸเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เดŽเดจเตเดจเดพเตฝ เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟ เด•เตเดฒเดพเดธเตเด•เตพ เดธเตเดตเดฏเด‚ เด•เตŠเดฃเตเดŸเตเดตเดฐเดพเดจเตเดณเตเดณ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเด‚ เด“เดตเตผเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดฎเดฟเด•เดšเตเดš เด†เดถเดฏเดฎเดฒเตเดฒ, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดˆ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเด‚ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ เด•เตเดฒเดพเดธเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเต เดฏเตเด•เตเดคเดฟเดธเดนเดฎเดพเดฃเต†เดจเตเดจเต เดคเต‹เดจเตเดจเตเดจเตเดจเต. เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต‹? เดžเดพเตป เดชเตเดฐเดคเตเดฏเต‡เด•เดฎเดพเดฏเดฟ เดˆ เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดจเต† เดฐเดฃเตเดŸเต เดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเดšเตเดšเต. เดฐเต€เดคเดฟเด•เดณเตเดŸเต† เด†เดฆเตเดฏ เดญเดพเด—เด‚ เดŽเดดเตเดคเตเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดฑเตˆเดฑเตเดฑเต เด“เดชเตเดชเดฑเต‡เดทเตป เด‡เดคเดพเดฃเต:

  • เด’เดฐเต เดชเตเดคเดฟเดฏ เดตเดธเตเดคเตเดตเดฟเดจเตเดฑเต† เดจเดฟเตผเดฎเตเดฎเดพเดฃเดตเตเด‚ เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟเดฏเตเด‚ เดชเต‹เดธเตเดฑเตเดฑเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ:: เดธเต‡เดตเต
  • เดชเต‹เดธเตเดฑเตเดฑเต เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ::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();
    }
}

เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฒเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เดฃเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เด‡เตป 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 เด•เตเดฑเดšเตเดšเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต เดชเต‹เดธเตเดฑเตเดฑเตเด•เตพ เด…เดคเดฟเดจเตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดžเด™เตเด™เตพ เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดค เดฆเดพเดคเดพเดตเดฟเตฝ เดชเต‹เดธเตเดฑเตเดฑเตเด•เตเดตเดฑเดฟเด•เตพ เด•เตเดฒเดพเดธเตเดธเดฟเดจเตŠเดชเตเดชเด‚ EloquentPostQueries เด•เตบเดŸเตเดฐเต‹เดณเดฑเดฟเดฒเต‡เด•เตเด•เต เดˆ เด•เตเดฒเดพเดธเต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด‚.

เดžเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดณเดฐเต† เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏเดคเดพเดฏเดฟ เดธเด™เตเด•เตฝเดชเตเดชเดฟเด•เตเด•เตเด•. เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเตฝ เด†เดฏเดฟเดฐเด•เตเด•เดฃเด•เตเด•เดฟเดจเต เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเต‡เดœเต เดคเตเดฑเด•เตเด•เตเดจเตเดจเต. เดเดฑเตเดฑเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฃเด™เตเด™เดณเตเด‚ เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เตพ เด…เดคเตเดคเดฐเด‚ เดฒเต‹เดกเตเด•เดณเต† เดจเดจเตเดจเดพเดฏเดฟ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เด…เดต เด’เดฐเต เดธเดพเดงเดพเดฐเดฃ เดชเดฐเดฟเดนเดพเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต - เด’เดฐเต เด•เดพเดทเต†. เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดจเต เดชเตเดฑเดฎเต‡, เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดกเดพเดฑเตเดฑ เดธเตเดจเดพเดชเตเดชเตเดทเต‹เดŸเตเดŸเต เดšเดฟเดฒ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตเดค เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเดฟเตฝ เดธเต‚เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต - 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();
            });
    }

    // ะดั€ัƒะณะธะต ะผะตั‚ะพะดั‹ ะฟั€ะฐะบั‚ะธั‡ะตัะบะธ ั‚ะฐะบะธะต ะถะต
}

เด‡เดจเตเดฑเตผเดซเต‡เดธเต เด…เดตเด—เดฃเดฟเด•เตเด•เตเด• เดธเด‚เดญเดฐเดฃเดฟเดฏเดพเดฃเต เด•เตบเดธเตเดŸเตเดฐเด•เตเดฑเตเดฑเดฑเดฟเตฝ. เด…เดœเตเดžเดพเดคเดฎเดพเดฏ เดšเดฟเดฒ เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ, เดฒเดพเดฑเดตเต†เดฒเดฟเตฝ เด•เดพเดทเต† เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดจเต เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเต‡เดฐเต เดจเตฝเด•เดพเตป เด…เดตเตผ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต.

เด•เตเดฒเดพเดธเต CachedPostQueries เด•เดพเดทเดฟเด‚เด—เต เดฎเดพเดคเตเดฐเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. $this->cache->เด“เตผเด•เตเด•เตเด• เดˆ เดŽเตปเดŸเตเดฐเดฟ เด•เดพเดทเต†เดฏเดฟเดฒเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‡เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด•เต‹เตพเดฌเดพเด•เตเด•เต เดตเดฟเดณเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด•เดพเดทเต†เดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เดฟเดฏ เดฎเต‚เดฒเตเดฏเด‚ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดˆ เด•เตเดฒเดพเดธเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด• เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด…เดญเตเดฏเตผเดคเตเดฅเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เด‰เดณเตเดณ เดŽเดฒเตเดฒเดพ เด•เตเดฒเดพเดธเตเด•เดณเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต เดชเต‹เดธเตเดฑเตเดฑเตเด•เตเดตเดฑเดฟเด•เตพ เด•เตเดฒเดพเดธเตเดธเดฟเดจเตเดฑเต† เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดฒเดญเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ CachedPostQueries. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด…เดตเตป เดคเดจเตเดจเต† CachedPostQueries เด•เตบเดธเตเดŸเตเดฐเด•เตเดฑเตเดฑเตผ เด’เดฐเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเดพเดฏเดฟ เด’เดฐเต เด•เตเดฒเดพเดธเต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เดฃเด‚ EloquentPostQueriesเด•เดพเดฐเดฃเด‚ "เดฏเดฅเดพเตผเดคเตเดฅ" เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดคเต† เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ. เดžเด™เตเด™เตพ เดฎเดพเดฑเตเดจเตเดจเต 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);
    }

    // ะดั€ัƒะณะธะต ะผะตั‚ะพะดั‹
}

เด•เดพเดทเต† เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด†เดตเดถเตเดฏเด‚ เดตเดฐเตเดฎเตเดชเต‹เตพ, เดฒเดณเดฟเดคเดฎเดพเดฏ เด’เดฐเต เดจเต€เด•เตเด•เดคเตเดคเดฟเดฒเต‚เดŸเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เด•เตเดฒเดพเดธเดฟเดจเตเดฑเต† เดธเตเดฅเดพเดจเดคเตเดคเต เด’เดฐเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดฎเต‚เตผเดคเตเดค เด•เตเดฒเดพเดธเต) เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดชเต‹เดธเตเดฑเตเดฑเตเด•เตเดตเดฑเดฟเด•เตพ, เด…เดคเดฟเดจเตเดฑเต† เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เด•เตเดฒเดพเดธเดฟเดฒเต‡เด•เตเด•เต เดชเด•เตผเดคเตเดคเตเด• EloquentPostQueries เดžเดพเตป เดจเต‡เดฐเดคเตเดคเต† เดตเดฟเดตเดฐเดฟเดšเตเดš เดธเตเด•เต€เดฎเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด•. เดฌเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ.

เด•เตเดฒเดพเดธเตเด•เตพ, เด‡เดจเตเดฑเตผเดซเต‡เดธเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเตเดณเตเดณ เดˆ เดคเดจเตเดคเตเดฐเด™เตเด™เดณเต†เดฒเตเดฒเดพเด‚ เด†เดถเตเดฐเดฟเดคเดคเตเดต เด•เตเดคเตเดคเดฟเดตเดฏเตเดชเตเดชเต ะธ CQRS เดŽเดจเตเดจเดคเดฟเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต เดŽเดจเตเดฑเต† เดชเตเดธเตเดคเด•เด‚ "เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เด“เดซเต เด•เต‹เด‚เดชเตเดฒเด•เตเดธเต เดตเต†เดฌเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ". เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเดฟเดฒเต† เดŽเดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เด•เตเดฒเดพเดธเตเด•เดณเตเด‚ เด…เดจเตเดคเดฟเดฎเดฎเดพเดฏเดฟ เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดคเต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต†เดจเตเดจ เด•เดŸเด™เตเด•เดฅเดฏเตเด•เตเด•เตเด‚ เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเดฎเตเดฃเตเดŸเต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•