repositories เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบเบฑเบš Eloquent?

เบญเบฒเบ—เบดเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™ เบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เปเบกเปˆเปเบšเบš Repository เบชเปเบฒเบฅเบฑเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™ Eloquentเปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบฅเบฒเบงเบชเบฑเบ™เบเบฒเบงเปˆเบฒเบˆเบฐเบšเบญเบเบ‚เป‰เบญเบเบงเบดเบ—เบตเบเบฒเบ™เปƒเบŠเป‰เบšเบฒเบ‡เบชเปˆเบงเบ™เป€เบžเบทเปˆเบญเบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡เบฅเบฒเบง. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ‚เป‰เบญเบเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบงเบดเป€เบ„เบฒเบฐเบงเบดเบ—เบตเบเบฒเบ™เปƒเบŠเป‰เปเบกเปˆเปเบšเบšเบ™เบตเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™. เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเปเบฒเบฅเบฑเบš repository:

<?php
interface PostRepository
{
    public function getById($id): Post;
    public function save(Post $post);
    public function delete($id);
}

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ repositories, เบงเบดเบ—เบตเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบถเบ‡เบšเบฑเบ™เบ—เบถเบเบกเบฑเบเบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ:

<?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, เปเบ•เปˆเบเบฒเบ™เป‚เบซเบผเบ”เบŠเบฑเป‰เบ™ entity เบซเบผเบฒเบเป€เบเบตเบ™เป„เบ›เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบเบฒเบ™เบ”เบถเบ‡เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”, เปเบฅเบฐเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ™เบตเป‰เป„เบ›เบชเบนเปˆเบซเป‰เบญเบ‡เบฎเบฝเบ™ repository เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบกเบตเป€เบซเบ”เบœเบปเบ™. เป€เบ›เบฑเบ™เปเบ™เบงเบ™เบฑเป‰เบ™เบšเป? เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเบฒเบเบ•เบฒเป„เบ”เป‰เปเบšเปˆเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ™เบตเป‰เบญเบญเบเป€เบ›เบฑเบ™เบชเบญเบ‡เบชเปˆเบงเบ™. เบชเปˆเบงเบ™เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฒเบ™เบ‚เบฝเบ™.

เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹เบเบฒเบ™โ€‹เบ‚เบฝเบ™โ€‹เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™โ€‹เปเบกเปˆเบ™โ€‹:

  • เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธเปƒเบซเบกเปˆเปเบฅเบฐเบชเบดเปˆเบ‡เบ—เป‰เบฒเบ—เบฒเบ PostRepository::save
  • PostRepository::getById, เบเบฒเบ™เบซเบกเบนเบ™เปƒเบŠเป‰ entity เปเบฅเบฐ summoning PostRepository::save
  • เบชเบดเปˆเบ‡เบ—เป‰เบฒเบ—เบฒเบ PostRepository::delete

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ‚เบฝเบ™เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ”เบถเบ‡เบ‚เปเป‰เบกเบนเบ™. เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบญเปˆเบฒเบ™, เบžเบฝเบ‡เปเบ•เปˆ get* เบงเบดเบ—เบตเบเบฒเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš เบซเบผเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš (เบˆเบปเบ”เปเบฒเบ I ะฒ เปเบเป‰เป„เบ‚), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป€เบเบตเบ™เป„เบ›เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเบญเบ‡เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเปเบšเปˆเบ‡เบกเบฑเบ™เป‚เบ”เบเบชเบญเบ‡. เบงเบดเบ—เบตเบเบฒเบ™ getById เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เปƒเบ™เบ—เบฑเบ‡เบชเบญเบ‡, เปเบ•เปˆเบเป‰เบญเบ™เบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™เบญเบฑเบ™เบ™เบตเป‰เป€เบฅเบฑเบเบ™เป‰เบญเบเบ•เปเปˆเบกเบฒ. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเป„เบฎเป‰เบ›เบฐเป‚เบเบ”เบ‚เบญเบ‡เบชเปˆเบงเบ™เบเบฒเบ™เบ‚เบฝเบ™เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบฅเบทเบกเบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™.

เบชเปˆเบงเบ™ Read เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบ, เป€เบžเบฒเบฐเบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบš Eloquent เบญเบฒเบ”เบˆเบฐเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เบˆเบฐเบ•เบฑเป‰เบ‡เบŠเบทเปˆเบซเป‰เบญเบ‡เบฎเบฝเบ™เปเบ™เบงเปƒเบ”? เบชเบฒโ€‹เบกเบฒเบ” ReadPostRepository, เปเบ•เปˆเบเบฑเบšเปเบกเปˆเปเบšเบš Repository เบฅเบฒเบงเบกเบตเบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบžเบฝเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเปเบฅเป‰เบง. เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ” PostQueries:

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

เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เบกเบตเบ›เบฐเป‚เบซเบเบ”เปเบฅเป‰เบง. เบฅเบฒเบงเบฎเบฑเบšเบฎเบนเป‰เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ‚เบญเบ‡เบ•เบปเบ™เป‚เบ”เบเบเบฒเบ™เบ›เบปเบ”เบ•เปเบฒเปเบซเบ™เปˆเบ‡เบœเบนเป‰เบ„เบงเบšเบ„เบธเบกเบซเบผเบทเบŠเบฑเป‰เบ™ entity. เปƒเบ™เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

<?php
final class PostsController extends Controller
{
    public function lastPosts(PostQueries $postQueries)
    {
        return view('posts.last', [
            'posts' => $postQueries->getLastPosts(),
        ]);
    }
} 

เบงเบดเบ—เบตเบเบฒเบ™ PostsController::lastPosts เบžเบฝเบ‡เปเบ•เปˆเบ‚เปเปƒเบซเป‰เบกเบตเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡ PostsQueries เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบกเบฑเบ™. เปƒเบ™เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PostQueries เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™ EloquentPostQueries เปเบฅเบฐเบŠเบฑเป‰เบ™เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเบ„เบงเบšเบ„เบธเบก.

เปƒเบซเป‰เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบ™เบดเบเบปเบกเบซเบผเบฒเบ. เบซเบฅเบฒเบเบžเบฑเบ™เบ„เบปเบ™เบ•เปเปˆเบ™เบฒเบ—เบตเป€เบ›เบตเบ”เบซเบ™เป‰เบฒเบ”เป‰เบงเบเบชเบดเปˆเบ‡เบžเบดเบกเบซเบฅเป‰เบฒเบชเบธเบ”. เบชเบดเปˆเบ‡เบžเบดเบกเบ—เบตเปˆเบ™เบดเบเบปเบกเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบเบฑเบ‡เบญเปˆเบฒเบ™เป€เบฅเบทเป‰เบญเบเป†. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบšเปเปˆเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เป‚เบซเบผเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบ”เบตเบซเบผเบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบ‚เบปเบฒเปƒเบŠเป‰เบเบฒเบ™เปเบเป‰เป„เบ‚เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ - cache. เบ™เบญเบเป€เปœเบทเบญเป„เบ›เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเป‰เบง, เบžเบฒเบšเบ–เปˆเบฒเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบˆเบฐเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบตเปˆเป€เปเบฒเบฐเบชเบปเบกเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡ - memcached เบซเบผเบท redis.

Caching เบ•เบฒเบกเป€เบซเบ”เบœเบปเบ™เบกเบฑเบเบˆเบฐเบšเปเปˆเบชเบฑเบšเบชเบปเบ™, เปเบ•เปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ EloquentPostQueries เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบซเบผเบฒเบ (เบ–เป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบเป‰เบญเบ™เบงเปˆเบฒ เบซเบผเบฑเบเบเบฒเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ”เบฝเบง). เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เปเบฒเบกเบฐเบŠเบฒเบ”เบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เปเบกเปˆเปเบšเบš เบญเบญเบเปเบšเบš เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ” caching เป€เบ›เบฑเบ™เบเบฒเบ™เบ•เบปเบšเปเบ•เปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเป‰เบ™เบ•เป:

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

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

เบšเปเปˆเบชเบปเบ™เปƒเบˆเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Repository เปƒเบ™เบœเบนเป‰เบเปเปˆเบชเป‰เบฒเบ‡. เบ”เป‰เบงเบเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบšเปเปˆเบฎเบนเป‰เบˆเบฑเบเบšเบฒเบ‡เบญเบฑเบ™, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ•เบฑเป‰เบ‡เบŠเบทเปˆเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบชเปเบฒเบฅเบฑเบš caching เปƒเบ™ Laravel เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰.

ะšะปะฐัั CachedPostQueries เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบžเบฝเบ‡เปเบ•เปˆ. $this->cache->เบˆเบทเปˆเป„เบงเป‰ เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบฅเบฒเบเบเบฒเบ™เบ™เบตเป‰เบขเบนเปˆเปƒเบ™ cache เปเบฅเบฐเบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป‚เบ—เบซเบฒ callback เปเบฅเบฐเบ‚เบฝเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบเบฑเบš cache. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบซเป‰เบญเบ‡โ€‹เบฎเบฝเบ™โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เป€เบžเบทเปˆเบญโ€‹เบฎเป‰เบญเบ‡โ€‹เบ‚เปโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ•เบญเบšโ€‹เป„เบ”เป‰โ€‹ PostQueries เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ 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) เบชเบฐโ€‹เป€เบซเบ™เบตโ€‹เปƒเบซเป‰โ€‹เปเบเบโ€‹เบญเบญเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบชเบปเบกโ€‹เบšเบนเบ™โ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹เบเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เปเบฅเบฐโ€‹เบ‚เบฝเบ™โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ•เบญเบšโ€‹. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบกเบฒเบซเบฒเบžเบฃเบฐเบญเบปเบ‡เป‚เบ”เบเบœเปˆเบฒเบ™ เบซเบผเบฑเบเบเบฒเบ™เปเบšเปˆเบ‡เบชเปˆเบงเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš, เป€เบŠเบดเปˆเบ‡เปเบ™เบฐเบ™เปเบฒเบงเปˆเบฒเบ‚เป‰เบญเบเบŠเปเบฒเบ™เบดเบŠเปเบฒเบ™เบฒเบ™เปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบฎเบนเบšเปเบšเบšเปเบฅเบฐเบซเบผเบฑเบเบเบฒเบ™เปเบฅเบฐเป€เบญเบปเบฒเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบˆเบฒเบเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เป€เบ›เบฑเบ™เบ—เบดเบ”เบชเบฐเบ”เบต :) เปเบ™เปˆเบ™เบญเบ™, เบšเปเปˆเปเบกเปˆเบ™เบ—เบธเบเป†เป‚เบ„เบ‡เบเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบปเบงเบซเบเปเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบทเบญเบเบซเบ™เปˆเบงเบเบ‡เบฒเบ™, เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเปเบšเปˆเบ‡เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเบฑเบšเบ—เปˆเบฒเบ™. เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ PostQueries เบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ›เบปเบเบเบฐเบ•เบดเป‚เบ”เบเบœเปˆเบฒเบ™ Eloquent:

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

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

เป€เบกเบทเปˆเบญเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเป€เบเบตเบ”เบ‚เบทเป‰เบ™, เบ”เป‰เบงเบเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‡เปˆเบฒเบเป†, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš (เบซเบผเบทเบซเป‰เบญเบ‡เบฎเบฝเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ•เบปเบงเบ•เบปเบ™) เปเบ—เบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰. PostQueries, เบ„เบฑเบ”เบฅเบญเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™เป„เบ›เบซเบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™ EloquentPostQueries เปเบฅเบฐเป„เบ›เบซเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰. เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.

tricks เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš, เบเบฒเบ™เบชเบตเบ”เบขเบฒเป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช ะธ CQRS เป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เปƒเบ™ เบ›เบทเป‰เบกเบ‚เบญเบ‡เบ‚เป‰เบญเบ "เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™". เบ™เบญเบเบ™เบฑเป‰เบ™เบเบฑเบ‡เบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ riddle เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ–เบทเบเบซเบกเบฒเบเป€เบ›เบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™