αžƒαŸ’αž›αžΆαŸ†αž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‡αžΆαž˜αž½αž™ 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 αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαŸ†αž„αž–αžΈαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžšαž”αžŸαŸ‹αžœαžΆαž“αžΉαž„αžαž»αžŸαž‚αŸ’αž“αžΆαŸ” αž™αžΎαž„β€‹αž“αžΉαž„β€‹αžƒαžΎαž‰β€‹αžœαžΆβ€‹αž”αž“αŸ’αžαž·αž…β€‹αž€αŸ’αžšαŸ„αž™β€‹αž˜αž€αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαžšαžŸαŸαžšαž’αŸ†αž–αžΈαž—αžΆαž–αž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒαž•αŸ’αž“αŸ‚αž€αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž˜αž»αž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ†αž—αŸ’αž›αŸαž…αžœαžΆαž…αŸ„αž›αŸ”

αž•αŸ’αž“αŸ‚αž€ Read αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžŸαžΌαžœαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸ αž–αŸ’αžšαŸ„αŸ‡αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Eloquent αž€αŸαž’αžΆαž…αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžŠαŸ‚αžšαŸ” αžαžΎαžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžαŸ’αž“αžΆαž€αŸ‹αž’αŸ’αžœαžΈ? αž’αžΆαž… ReadPostRepositoryαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž…αŸ†αž–αŸ„αŸ‡αž‚αŸ†αžšαžΌ αžƒαŸ’αž›αžΆαŸ†αž„ αž‚αžΆαžαŸ‹αž˜αžΆαž“αž—αžΆαž–αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αžαž·αž…αžαž½αž…αžšαž½αž…αž‘αŸ…αž αžΎαž™αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚ 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();
    }
}

αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž§αž‘αžΆαž αžšαžŽαŸαž€αŸ’αž“αž»αž„ αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ:

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

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž PostController::lastPosts αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŸαž»αŸ†αž±αŸ’αž™αž’αž“αž»αžœαžαŸ’αžαžαŸ’αž›αŸ‡ PostQueries αž“αž·αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžœαžΆαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαžŠαŸ‚αž›αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹ PostQueries αž‡αžΆαž˜αž½αž™αžαŸ’αž“αžΆαž€αŸ‹ EloquentPostQueries αž αžΎαž™αžαŸ’αž“αžΆαž€αŸ‹αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αž“αž½αžŸαž‘αŸ…αž€αŸ’αž“αž»αž„αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΆαŸ”

αžŸαžΌαž˜αžŸαŸ’αžšαž˜αŸƒαžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‡αžΆαž€αžΆαžšαž–αŸαž‰αž“αž·αž™αž˜αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ” αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαžΆαž”αŸ‹αž–αžΆαž“αŸ‹αž“αžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž˜αž½αž™αž“αžΆαž‘αžΈαž”αžΎαž€αž‘αŸ†αž–αŸαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαŸ” αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αžŠαŸ‚αž›αž–αŸαž‰αž“αž·αž™αž˜αž”αŸ†αž•αž»αžαž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αž•αž„αžŠαŸ‚αžšαŸ” αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αž“αŸ’αž‘αž»αž€αž”αŸ‚αž”αž“αŸαŸ‡αž”αžΆαž“αž›αŸ’αž’αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž½αž€αž‚αŸαž”αŸ’αžšαžΎαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš - αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžšαžΌαž”αžαžαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαžŸαžΎαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ - memcached ឬ 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 αžαžΆαž˜αžœαž·αž’αžΈαž“αŸαŸ‡αŸ”

Класс CachedPostQueries αž’αž“αž»αžœαžαŸ’αžαžαŸ‚αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” $this->cache-> αž…αž„αž…αžΆαŸ† αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαž’αžΆαžαž»αž“αŸαŸ‡αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž¬αž’αžαŸ‹ αž“αŸ„αŸ‡αž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αž‘αŸ…αž€αžΆαžšαž αŸ…αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ αž αžΎαž™αžŸαžšαžŸαŸαžšαžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ” αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αžαžαŸ’αž“αžΆαž€αŸ‹αž“αŸαŸ‡αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžαŸ’αž“αžΆαž€αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ PostQueries αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αž‘αž½αž›αž”αžΆαž“αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ CachedPostQueries. αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™αž‚αžΆαžαŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹ CachedPostQueries αž’αŸ’αž“αž€αžŸαžΆαž„αžŸαž„αŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž‘αž‘αž½αž›αž”αžΆαž“αžαŸ’αž“αžΆαž€αŸ‹αž‡αžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš EloquentPostQueriesαž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαžœαžΆαž˜αž·αž“αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž "αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ" αŸ” αž™αžΎαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ:

<?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 αž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž–αžΈαž˜αž»αž“αŸ” αž›αŸαžαž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸαŸ”

αž›αŸ’αž”αž·αž…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαŸ’αž“αžΆαž€αŸ‹, αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹, αž€αžΆαžšαž…αžΆαž€αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ ΠΈ CQRS αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž“αŸ…αž€αŸ’αž“αž»αž„ αžŸαŸ€αžœαž—αŸ…αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† "αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αžŽαŸ’αžαžΆαž‰αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰". αžœαžΆαž€αŸαž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž…αŸ†αž–αŸ„αŸ‡αž–αžΆαž€αŸ’αž™αžŸαŸ’αž›αŸ„αž€αžαžΆαž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαžαŸ’αž“αžΆαž€αŸ‹αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹