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

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

.เฉฐเจ— PostsController::lastPosts เจฌเจธ เจ•เฉเจ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจชเฉเฉฑเจ› เจฐเจฟเจนเจพ เจนเฉˆ เจชเฉ‹เจธเจŸเจธเจ•เฉเจ†เจฐเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ‡เจธ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ. เจชเฉเจฐเจฆเจพเจคเจพ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฒเจฟเฉฐเจ• เจ•เฉ€เจคเจพ เจนเฉˆ เจชเฉ‹เจธเจŸ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจ•เจฒเจพเจธ เจฆเฉ‡ เจจเจพเจฒ EloquentPostQuerys เจ…เจคเฉ‡ เจ‡เจธ เจ•เจฒเจพเจธ เจจเฉ‚เฉฐ เจ•เฉฐเจŸเจฐเฉ‹เจฒเจฐ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจšเจฒเฉ‹ เจ•เจฒเจชเจจเจพ เจ•เจฐเฉ€เจ เจ•เจฟ เจธเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจนเฉเจค เจฎเจธเจผเจนเฉ‚เจฐ เจนเฉ‹ เจ—เจˆ เจนเฉˆ. เจชเฉเจฐเจคเฉ€ เจฎเจฟเฉฐเจŸ เจนเจœเจผเจพเจฐเจพเจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเจตเฉ€เจจเจคเจฎ เจชเฉเจฐเจ•เจพเจธเจผเจจเจพเจ‚ เจจเจพเจฒ เจชเฉฐเจจเจพ เจ–เฉ‹เจฒเฉเจนเจฆเฉ‡ เจนเจจเฅค เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจธเจฟเฉฑเจง เจชเฉเจฐเจ•เจพเจธเจผเจจ เจตเฉ€ เจ…เจ•เจธเจฐ เจชเฉœเฉเจนเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ. เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ…เจœเจฟเจนเฉ‡ เจฒเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจšเฉฐเจ—เฉ€ เจคเจฐเฉเจนเจพเจ‚ เจจเจนเฉ€เจ‚ เจธเฉฐเจญเจพเจฒเจฆเฉ‡, เจ‡เจธเจฒเจˆ เจ‰เจน เจ‡เฉฑเจ• เจฎเจฟเจ†เจฐเฉ€ เจนเฉฑเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจ - เจ‡เฉฑเจ• เจ•เฉˆเจธเจผ. เจกเจพเจŸเจพเจฌเฉ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ•เฉเจ เจ–เจพเจธ เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจธเจŸเฉ‹เจฐเฉ‡เจœ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ–เจพเจธ เจกเจพเจŸเจพ เจธเจจเฉˆเจชเจธเจผเจพเจŸ เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ - เจฎเฉˆเจฎเจ•เฉˆเจšเจก เจœ redis.

เจ•เฉˆเจšเจฟเฉฐเจ— เจคเจฐเจ• เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฐเจจเจพ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจธ เจจเฉ‚เฉฐ 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->เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจ‡เจน เจเจ‚เจŸเจฐเฉ€ เจ•เฉˆเจธเจผ เจตเจฟเฉฑเจš เจนเฉˆ เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจจเจนเฉ€เจ‚, เจคเจพเจ‚ เจ•เจพเจฒเจฌเฉˆเจ• เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ•เฉˆเจธเจผ เจตเจฟเฉฑเจš เจตเจพเจชเจธ เจ•เฉ€เจคเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจ•เจฒเจพเจธ เจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจฌเจพเจ•เฉ€ เจนเฉˆเฅค เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจจ เจฒเจˆ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจชเฉ‹เจธเจŸ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจ•เจฒเจพเจธ เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจ•เฉˆเจธเจผเจกเจชเฉ‹เจธเจŸเจ•เจตเฉ‡เจฐเฉ€เจ†เจ‚. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‰เจธเจจเฉ‡ เจ–เฉเจฆ เจ•เฉˆเจธเจผเจกเจชเฉ‹เจธเจŸเจ•เจตเฉ‡เจฐเฉ€เจ†เจ‚ เจ•เฉฐเจธเจŸเจฐเจ•เจŸเจฐ เจจเฉ‚เฉฐ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฒเจพเจธ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹