ื ื•ืฆื™ืง ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื– ืžื™ื˜ ืขืœืึทืงื•ื•ืึทื ื˜?

ืœืขืฆื˜ืข ื•ื•ืึธืš ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ื“ื™ ื•ืกืขืœืขืกืกื ืขืกืก ืคื•ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืžื•ืกื˜ืขืจ ืคึฟืึทืจ ืขืœืึทืงื•ื•ืึทื ื˜ ืขื ื˜ื™ื˜ื™ื–ืขืจ ื”ืื˜ ืื‘ืขืจ ืฆื•ื’ืขื–ืื’ื˜ ืžื™ืจ ืฆื• ื–ืื’ืŸ ืฐื™ ืื–ื•ื™ ืฆื• ื˜ืฒืœืฐืฒื– ืฆื•ื ื•ืฆืŸ ืฆื• ื–ืฒืŸ ื˜ืฒืœ. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื™ืš ื•ื•ืขืœ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืคื•ื ืึทื ื“ืขืจืงืœื™ื™ึทื‘ืŸ ื•ื•ื™ ื“ืขื ืžื•ืกื˜ืขืจ ืื™ื– ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืคึผืจืึทื“ื–ืฉืขืงืก. ื“ื™ ืžื™ื ื™ืžื•ื ืคืืจืœืื ื’ื˜ ื’ืึทื ื’ ืคื•ืŸ ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ืึท ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™:

<?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 :: ื”ื™ื˜
  • PostRepository::getById, ืขื ื˜ื™ื˜ื™ ืžืึทื ื™ืคึผื™ืึทืœื™ื™ืฉืึทืŸ ืื•ืŸ ืึทืจื•ื™ืกืจื•ืคืŸ PostRepository :: ื”ื™ื˜
  • ืึท ืึทืจื•ื™ืกืจื•ืคืŸ PostRepository :: ื•ื™ืกืžืขืงืŸ

ืฉืจื™ื™ื‘ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื˜ืึธืŸ ื ื™ื˜ ื ื•ืฆืŸ ื‘ืจืขื ื’ืขืŸ ืžืขื˜ื”ืึธื“ืก. ืื™ืŸ ืœื™ื™ืขื ืขืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–, ื‘ืœื•ื™ื– ื‘ืึทืงื•ืžืขืŸ * ืžืขื˜ื”ืึธื“ืก ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜. ืื•ื™ื‘ ืื™ืจ ืœื™ื™ืขื ืขืŸ ื•ื•ืขื’ืŸ ืฆื•ื‘ื™ื ื“ ืกืขื’ืจืขื’ืึทื˜ื™ืึธืŸ ืคึผืจื™ื ืฆื™ืคึผ (ื‘ืจื™ื•ื• I ะฒ SOLID), ื“ืขืžืึธืœื˜ ืขืก ื•ื•ืขื˜ ื•ื•ืขืจืŸ ืงืœืึธืจ ืึทื– ืื•ื ื“ื–ืขืจ ืฆื•ื‘ื™ื ื“ ืื™ื– ืฆื• ื’ืจื•ื™ืก ืื•ืŸ ืคึผืขืจืคืึธืจืžื– ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ ืฆื•ื•ื™ื™ ืคืึทืจืฉื™ื“ืขื ืข ืจื™ืกืคึผืึทื ืกืึทื‘ื™ืœืึทื˜ื™ื–. ืขืก ืื™ื– ืฆื™ื™ื˜ ืฆื• ื˜ื™ื™ืœืŸ ืขืก ื“ื•ืจืš ืฆื•ื•ื™ื™. ืžืขื˜ืึธื“ getById ืื™ื– ื ื™ื™ื˜ื™ืง ืื™ืŸ ื‘ื™ื™ื“ืข, ืึธื‘ืขืจ ื•ื•ื™ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืขืจื˜ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜, ื“ื™ ื™ืžืคึผืœืึทืžืึทื ืฅ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึทื ื“ืขืจืฉ. ืžื™ืจ ื•ื•ืขืœืŸ ื“ืึธืก ื–ืขืŸ ืึท ื‘ื™ืกืœ ืฉืคึผืขื˜ืขืจ. ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ื•ื•ืขื’ืŸ ื“ื™ ื•ืกืขืœืขืกืกื ืขืกืก ืคื•ืŸ ื“ื™ ืฉืจื™ื™ึทื‘ืŸ ื˜ื™ื™ืœ ืื™ืŸ ืึท ืคืจื™ืขืจื“ื™ืงืŸ ืึทืจื˜ื™ืงืœ, ืึทื–ื•ื™ ืื™ืŸ ื“ืขื ืื™ืš ื•ื•ืขื˜ ืคืฉื•ื˜ ืคืึทืจื’ืขืกืŸ ื•ื•ืขื’ืŸ ืื™ื.

ื“ืขืจ ืœื™ื™ืขื ืขืŸ ื˜ื™ื™ืœ ืžื™ื™ื ื˜ ืฆื• ืžื™ืจ ื ื™ืฉื˜ ืึทื–ื•ื™ ืึทืจื•ื™ืกื’ืขื•ื•ืึธืจืคืŸ, ื•ื•ื™ื™ึทืœ ืืคื™ืœื• ืคึฟืึทืจ ืขืœืึทืงื•ื•ืึทื ื˜ ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืขื˜ืœืขื›ืข ื™ืžืคึผืœืึทืžืึทื ืฅ ื“ืึธ. ื•ื•ืึธืก ืฆื• ื ืึธืžืขืŸ ื“ื™ ืงืœืึทืก? ืงืขื ืขืŸ 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();
    }
}

ื“ื™ ืฆื•ื‘ื™ื ื“ ืžื•ื–ืŸ ื–ื™ื™ืŸ ืคืืจื‘ื•ื ื“ืŸ ืžื™ื˜ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ, ืœืžืฉืœ ืื™ืŸ 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 ื ืึธืจ ืึทืกืงื™ื ื’ ืคึฟืึทืจ ืขื˜ืœืขื›ืข ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ PostsQueries ืื•ืŸ ืึทืจื‘ืขื˜ ืžื™ื˜ ืื™ื. ืื™ืŸ ื“ืขืจ ืฉืคึผื™ื™ึทื–ืขืจ ืžื™ืจ ืœื™ื ื’ืงื˜ PostQueries ืžื™ื˜ ืงืœืึทืก EloquentPostQueries ืื•ืŸ ื“ืขื ืงืœืึทืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืกืึทื‘ืกื˜ืึทื˜ื•ื˜ืึทื“ ืื™ืŸ ื“ื™ ืงืึธื ื˜ืจืึธืœืœืขืจ.

ื–ืืœ ืก ื™ืžืึทื“ื–ืฉืึทืŸ ืึทื– ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื’ืขื•ื•ืืจืŸ ื–ื™ื™ืขืจ ืคืึธืœืงืก. ื˜ื•ื™ื–ื ื˜ืขืจ ืคื•ืŸ ื™ื•ื–ืขืจื– ืคึผืขืจ ืžื™ื ื•ื˜ ืขืคืขื ืขืŸ ื“ืขื ื‘ืœืึทื˜ ืžื™ื˜ ื“ื™ ืœืขืฆื˜ืข ืื•ื™ืกื’ืื‘ืขืก. ื“ื™ ืžืขืจืกื˜ ืคืึธืœืงืก ืื•ื™ืกื’ืื‘ืขืก ื–ืขื ืขืŸ ืื•ื™ืš ืœื™ื™ืขื ืขืŸ ื–ื™ื™ืขืจ ืึธืคื˜. ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื– ื˜ืึธืŸ ื ื™ื˜ ืฉืขืคึผืŸ ืึทื–ืึท ืœืึธื•ื“ื– ื–ื™ื™ืขืจ ื’ื•ื˜, ืึทื–ื•ื™ ื–ื™ื™ ื ื•ืฆืŸ ืึท ื ืึธืจืžืึทืœ ืœื™ื™ื–ื•ื ื’ - ืงืึทืฉ. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก, ืึท ื–ื™ื›ืขืจ ื“ืึทื˜ืŸ ืžืึธืžืขื ื˜ื‘ื™ืœื“ ืื™ื– ืกื˜ืึธืจื“ ืื™ืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืึธืคึผื˜ื™ืžื™ื–ืขื“ ืคึฟืึทืจ ื–ื™ื›ืขืจ ืึทืคึผืขืจื™ื™ืฉืึทื ื– - ืžืขืžืงืึทื˜ืฉืขื“ ืึธื“ืขืจ ืจืขื“ื™ืก.

ืงืึทื˜ืฉื™ื ื’ ืœืึธื’ื™ืง ืื™ื– ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื ื™ืฉื˜ ืึทื–ื•ื™ ืงืึธืžืคึผืœื™ืฆื™ืจื˜, ืึธื‘ืขืจ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืขืก ืื™ืŸ 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 ื™ืžืคึผืœืึทืžืึทื ืฅ ื‘ืœื•ื™ื– ืงืึทื˜ืฉื™ื ื’. $ ื“ืขื-> ืงืึทืฉ-> ื’ืขื“ืขื ืงืขืŸ ื˜ืฉืขืง ืฆื™ ื“ืขื ืคึผืึธื–ื™ืฆื™ืข ืื™ื– ืื™ืŸ ื“ื™ ืงืึทืฉ ืื•ืŸ ืื•ื™ื‘ ื ื™ื˜, ื“ืึทืŸ ืงืึทืœืœืก ืงืึทืœืœื‘ืึทืงืง ืื•ืŸ ืฉืจื™ื™ื‘ื˜ ื“ื™ ืื•ืžื’ืขืงืขืจื˜ ื•ื•ืขืจื˜ ืฆื• ื“ื™ ืงืึทืฉ. ืึทืœืข ื•ื•ืึธืก ื‘ืœื™ื™ื‘ื˜ ืื™ื– ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ืขื ืงืœืึทืก ืื™ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึทืœืข ืงืœืืกืŸ ืื™ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื• ื‘ืขื˜ืŸ ืึทืŸ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืฆื•ื‘ื™ื ื“ 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 ืื•ืŸ ื’ื™ื™ืŸ ืฆื• ื“ื™ ืกื›ืขืžืข ืื™ืš ื“ื™ืกืงืจื™ื™ื‘ื“ ืคืจื™ืขืจ. ื“ื™ ืจืขืฉื˜ ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืึธื“ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ื˜ืฉื™ื™ื ื“ื–ืฉื“.

ืึทืœืข ื“ื™ ื˜ืจื™ืงืก ืžื™ื˜ ืงืœืืกืŸ, ื™ื ื˜ืขืจืคื™ื™ืกื™ื–, ื“ืขืคึผืขื ื“ืขื ืกื™ ื™ื ื“ื–ืฉืขืงืฉืึทืŸ ะธ CQRS ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ืขื˜ืึทืœ ืื™ืŸ ืžื™ื™ืŸ ื‘ื•ืš "ืึทืจื˜ืฉื™ื˜ืขืงื˜ืฉืขืจ ืคื•ืŸ ืงืึธืžืคึผืœืขืงืก ื•ื•ืขื‘ ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธื ืก". ืขืก ืื™ื– ืื•ื™ืš ืึท ืœื™ื™ื–ื•ื ื’ ืฆื• ื“ื™ ืจืขื˜ืขื ื™ืฉ ื•ื•ืึธืก ืึทืœืข ืžื™ื™ืŸ ืงืœืืกืŸ ืื™ืŸ ื“ื™ ื‘ื™ื™ืฉืคื™ืœืŸ ืคึฟืึทืจ ื“ืขื ืึทืจื˜ื™ืงืœ ื–ืขื ืขืŸ ืื ื’ืขืฆื™ื™ื›ื ื˜ ื•ื•ื™ ืœืขืฆื˜.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’