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::save
  • PostRepository::getById, เชเชจเซเชŸเชฟเชŸเซ€ เชฎเซ‡เชจเซ€เชชเซเชฏเซเชฒเซ‡เชถเชจ เช…เชจเซ‡ เชธเชฎเชจเซเชธเชฟเช‚เช— PostRepository::save
  • เชเช• เชชเชกเช•เชพเชฐ 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);
}

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

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

เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เช…เชตเช—เชฃเซ‹ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เช•เชจเซเชธเซเชŸเซเชฐเช•เซเชŸเชฐเชฎเชพเช‚. เช•เซ‡เชŸเชฒเชพเช• เช…เชœเซเชžเชพเชค เช•เชพเชฐเชฃเซ‹เชธเชฐ, เชคเซ‡เช“เช เชฒเชพเชฐเชพเชตเซ‡เชฒเชฎเชพเช‚ เช•เซ‡เชถเซ€เช‚เช— เชฎเชพเชŸเซ‡เชจเชพ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชจเซ‡ เช† เชฐเซ€เชคเซ‡ เชจเชพเชฎ เช†เชชเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚.

ะšะปะฐัั 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹