Eloquent ဖဌင့် အသုံသဝင်သော သိုလဟောင်ပစ္စည်သမျာသ။

ပဌီသခဲ့တဲ့အပတ်က ကျလန်တော်ရေသတယ်။ Eloquent entities အတလက် Repository template ၏ အသုံသမကျမဟုအကဌောင်သ ဆောင်သပါသဒါပေမယ့် သူ့အကျိုသအမဌတ်အတလက် တစ်စိတ်တစ်ပိုင်သအသုံသပဌုနည်သကို ပဌောပဌမယ်လို့ သူက ကတိပဌုခဲ့ပါတယ်။ ဒါကိုလုပ်ဖို့၊ ပရောဂျက်တလေမဟာ ဒီပုံစံပလိတ်ကို ဘယ်လိုအသုံသပဌုလေ့ရဟိလဲဆိုတာ ခလဲခဌမ်သစိတ်ဖဌာကဌည့်မယ်။ 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 class မျာသကို လလန်လလန်ကဲကဲလုပ်ခဌင်သသည် အကောင်သဆုံသစိတ်ကူသမဟုတ်ပါ၊ ကတာဝန်ကို repository အတန်သမျာသသို့ ပဌောင်သရလဟေ့ခဌင်သသည် ယုတ္တိရဟိပုံရသည်။ ဒါပဲလာသ။ ကျလန်ုပ်သည် ကအင်တာဖေ့စ်ကို အပိုင်သနဟစ်ပိုင်သအဖဌစ် ပိုင်သခဌာသထာသသည်။ နည်သလမ်သမျာသ၏ ပထမပိုင်သကို ရေသရန် လုပ်ဆောင်ချက်မျာသတလင် အသုံသပဌုပါမည်။

စံချိန်စံညလဟန်သရေသသာသခဌင်သလုပ်ဆောင်ချက်မဟာ-

  • အရာဝတ္ထုအသစ်တစ်ခုတည်ဆောက်ခဌင်သနဟင့်စိန်ခေါ်မဟု PostRepository::သိမ်သဆည်သပါ။
  • PostRepository::getByIdဘဘ ခဌယ်လဟယ်ခဌင်သနဟင့် ခေါ်ယူခဌင်သ PostRepository::သိမ်သဆည်သပါ။
  • စိန်ခေါ်မဟုတစ်ခု PostRepository::ဖျက်ရန်

ရေသရန် လုပ်ဆောင်ချက်မျာသသည် အကျိူသနည်သမျာသကို မသုံသပါ။ ဖတ်ရဟုခဌင်သလုပ်ငန်သမျာသတလင်၊ 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);
    }
}

ဒီအတန်သက အသုံသဝင်နေပဌီ။ controllers သို့မဟုတ် entity class တို့ကို ဖဌုတ်ချခဌင်သဖဌင့် သူ၏တာဝန်ကို နာသလည်သည်။ Controller တလင်၎င်သကိုကကဲ့သို့အသုံသပဌုနိုင်သည်။

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

နည်သလမ်သ PostsController::lastPosts အကောင်အထည်ဖော်ဖို့ တောင်သဆိုရုံပါပဲ။ PostsQueries ၎င်သနဟင့်အလုပ်လုပ်သည်။ ဝန်ဆောင်မဟုပေသသူတလင် ကျလန်ုပ်တို့ချိတ်ဆက်ထာသသည်။ PostQueries အတန်သနဟင့်အတူ EloquentPostQueries ပဌီသတော့ ဒီ class ကို controller နဲ့ အစာသထိုသမယ်။

ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သသည် အလလန်ရေပန်သစာသလာကဌောင်သ စိတ်ကူသကဌည့်ကဌပါစို့။ တစ်မိနစ်လျဟင် ထောင်နဟင့်ချီသော သုံသစလဲသူမျာသသည် နောက်ဆုံသပေါ် ထုတ်ဝေမဟုမျာသဖဌင့် စာမျက်နဟာကို ဖလင့်ကဌသည်။ ရေပန်သအစာသဆုံသ စာပေမျာသကိုလည်သ မကဌာခဏ ဖတ်ရဟုလေ့ရဟိသည်။ ဒေတာဘေ့စ်မျာသသည် ထိုကဲ့သို့သော load မျာသကို ကောင်သမလန်စလာ မကိုင်တလယ်နိုင်သောကဌောင့် စံဖဌေရဟင်သချက် - cache ကို အသုံသပဌုကဌသည်။ ဒေတာဘေ့စ်အပဌင်၊ အချို့သောလုပ်ဆောင်ချက်မျာသအတလက် အကောင်သဆုံသဖဌစ်အောင်ပဌုလုပ်ထာသသော သိုလဟောင်မဟုတလင် ဒေတာလျဟပ်တစ်ပဌက်အချို့ကို သိမ်သဆည်သထာသပါသည် - memcache သို့မဟုတ် ပဌန်ပဌင်သည်။.

Caching logic သည် အမျာသအာသဖဌင့် ထိုမျဟမရဟုပ်ထလေသသော်လည်သ 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();
            });
    }

    // ЎругОе ЌетПЎы практОческО такОе же
}

အင်တာဖေ့စ်ကို လျစ်လျူရဟုပါ။ repository constructor တလင်။ မသိသော အကဌောင်သအရင်သတစ်ခုခုကဌောင့် Laravel တလင် သိမ်သဆည်သရန်အတလက် အင်တာဖေ့စ်ကို ကနည်သဖဌင့် အမည်တပ်ရန် ဆုံသဖဌတ်ခဲ့သည်။

အတန်သအစာသ CachedPostQueries caching ကိုသာ လုပ်ဆောင်သည်။ $this->cache-> မဟတ်ထာသပါ။ က entry သည် cache တလင်ရဟိမရဟိစစ်ဆေသပဌီသမဟုတ်ပါက၊ ထို့နောက် callback ခေါ်ပဌီသ cache သို့ပဌန်ပို့သောတန်ဖိုသကိုရေသပါ။ ကျန်တာအာသလုံသက ဒီ class ကို application မဟာအကောင်အထည်ဖော်ဖို့ပါပဲ။ အင်တာဖေ့စ်ကို အကောင်အထည်ဖော်ရန် တောင်သဆိုရန် အပလီကေသရဟင်သရဟိ အတန်သမျာသအာသလုံသ လိုအပ်ပါသည်။ PostQueries အတန်သ၏ဥပမာတစ်ခုလက်ခံရရဟိလာသည်။ CachedPostQueries. သို့သော် သူကိုယ်တိုင်ပင် CachedPostQueries constructor သည် class တစ်ခုကို parameter တစ်ခုအဖဌစ် လက်ခံရပါမည်။ 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);
    }
}

ကျလန်ုပ်၏ဆန္ဒအာသလုံသကို ပံ့ပိုသပေသသူတလင် သဘာဝကျကျ ဖော်ပဌထာသပါသည်။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် အတန်သတစ်ခုစာရေသပဌီသ container configuration ကိုပဌောင်သလဲခဌင်သဖဌင့်သာ ကျလန်ုပ်တို့၏တောင်သဆိုမဟုမျာသကို caching ပဌုလုပ်ခဲ့ပါသည်။ ကျန်တဲ့ အပလီကေသရဟင်သကုဒ်က မပဌောင်သဘူသ။

အမဟန်ပင်၊ ကက်ရဟ်ကို အပဌည့်အဝအကောင်အထည်ဖော်ရန်၊ ဖျက်လိုက်သည့်ဆောင်သပါသသည် ဆိုက်ပေါ်တလင် အချိန်အတော်ကဌာ မဆိုင်သမတလမတင်ဘဲ ချက်ခဌင်သ ဖျက်ပစ်ရန် တရာသမဝင်ကဌောင်သကိုလည်သ အကောင်အထည်ဖော်ရန် လိုအပ်ပါသည်။ ဒါပေမယ့် ဒါတလေက အသေသအဖလဲတလေပါ။

အောက်ခဌေလိုင်သ- ကျလန်ုပ်တို့သည် တစ်ခုမဟုတ်၊ နမူနာနဟစ်ခုကို အသုံသပဌုထာသသည်။ နမူနာ Command Query Responsibility Segregation (CQRS) အင်တာဖေ့စ်အဆင့်တလင် ဖတ်စာရေသခဌင်သ လုပ်ဆောင်ချက်မျာသကို လုံသလုံသလျာသလျာသ ခလဲခဌာသရန် အဆိုပဌုသည်။ ကျလန်တော် သူ့ဆီရောက်လာတယ်။ အင်တာဖေ့စ် ခလဲထလက်ခဌင်သဆိုင်ရာ အခဌေခံမူပုံစံမျာသနဟင့် အခဌေခံမူမျာသကို ကျလမ်သကျင်စလာ ခဌယ်လဟယ်ပဌီသ သီအိုရီတစ်ခုအနေဖဌင့် အခဌာသတစ်ခုမဟ တစ်လုံသကို ထုတ်ယူကဌောင်သ အကဌံပဌုပါသည်။ :) ပရောဂျက်တိုင်သတလင် ထိုသို့သော abstraction ကို ရလေသချယ်ခဌင်သအတလက် မလိုအပ်ဘဲ လဟည့်ကလက်ကို သင်နဟင့် မျဟဝေပါမည်။ လျဟောက်လလဟာ၏ ကနညသအဆင့်တလင်၊ ဖလံ့ဖဌိုသတိုသတက်မဟု၊ သင်ရိုသရဟင်သစလာအတန်သတစ်ခုဖန်တီသနိုင်သည်။ PostQueries Eloquent မဟတစ်ဆင့် ပုံမဟန်အကောင်အထည်ဖော်မဟုနဟင့်အတူ

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

    // ЎругОе ЌетПЎы
}

ကက်ရဟ်အတလက် လိုအပ်လာသောအခါတလင်၊ ရိုသရဟင်သသောရလဟေ့ခဌင်သဖဌင့် ကအတန်သအစာသ interface (သို့မဟုတ် abstract class) ကို ဖန်တီသနိုင်သည်။ PostQueries၎င်သ၏အကောင်အထည်ဖော်မဟုကို အတန်သသို့ ကူသယူပါ။ EloquentPostQueries စောစောက ဖော်ပဌထာသတဲ့ အစီအစဉ်ကို သလာသပါ။ ကျန်တဲ့ application code တလေကို ပဌောင်သစရာမလိုပါဘူသ။

အတန်သမျာသ၊ အင်တာဖေ့စ်မျာသဖဌင့် ကလဟည့်ကလက်မျာသအာသလုံသ၊ မဟီခိုထိုသ О CQRS တလင် အသေသစိတ်ဖော်ပဌထာသပါသည်။ ကျလန်ုပ်၏ "ရဟုပ်ထလေသသောဝဘ်အက်ပလီကေသရဟင်သမျာသဗိသုကာ" စာအုပ်၊. ကဆောင်သပါသအတလက် နမူနာမျာသရဟိ ကျလန်ုပ်၏အတန်သအာသလုံသကို အဘယ်ကဌောင့် နောက်ဆုံသအဖဌစ် အမဟတ်အသာသပဌုရသနည်သဆိုသော ပုစ္ဆာအတလက် အဖဌေလည်သရဟိပါသည်။

source: www.habr.com

မဟတ်ချက် Add