Meelo faa'iido leh oo leh Af-hayeenka?

Toddobaadkii hore ayaan qoray maqaal ku saabsan faa'iido la'aanta template Repository ee hay'adaha codkar ah, si kastaba ha ahaatee, wuxuu ii ballanqaaday inuu ii sheego sida qayb ahaan looga faa'iidaysto faa'iidada. Si tan loo sameeyo, waxaan isku dayi doonaa inaan falanqeeyo sida qaabkan caadiga ah loogu isticmaalo mashaariicda. Habka ugu yar ee loo baahan yahay ee kaydka:

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

Si kastaba ha ahaatee, mashaariicda dhabta ah, haddii la go'aamiyay in la isticmaalo bakhaarada, hababka dib u soo celinta diiwaanada ayaa badanaa lagu daraa iyaga:

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

Hababkan waxaa lagu hirgelin karaa iyadoo loo marayo cabbirro hadal badan, laakiin culeyska xad-dhaafka ah ee qaybaha hay'adaha ee leh mas'uuliyadda inay naftooda soo helaan maaha fikradda ugu fiican, iyo u wareejinta mas'uuliyaddan fasallada kaydinta waxay u muuqataa mid macquul ah. Ma sidaas baa? Waxaan si gaar ah muuqaal ahaan u kala qaybiyay interface-kan laba qaybood. Qaybta hore ee hababka waxaa loo isticmaali doonaa hawlgallada qorista.

Hawlgalka qorista caadiga ah waa:

  • dhisidda shay cusub iyo caqabad Kaydka ka dib:: kaydi
  • Kaydka ka dib::getById, wax isdaba marin iyo u yeedhid Kaydka ka dib:: kaydi
  • Caqabada Kaydka ka dib:: tirtir

Hawlgallada qorista ma isticmaalaan hababka soo-qaadista. Hawlgallada wax-akhrinta, helida hababka* ayaa la adeegsadaa. Hadii aad wax ka akhrido Mabaadi'da Kala soocida Interface (warqad I Π² SOLID), markaas waxaa cadaan doonta in is-dhexgalkeena uu aad u weyn yahay oo uu qabto ugu yaraan laba mas'uuliyad oo kala duwan. Waa markii laba loo qaybin lahaa. Habka heliById waa lagama maarmaan labadaba, laakiin marka codsigu noqdo mid aad u adag, fulintiisu way kala duwanaan doontaa. Waxaan arki doonaa tan wax yar ka dib. Waxaan ku qoray maqaal hore oo ku saabsan faa'iido la'aanta qaybta qoraalka, sidaas darteed middan ayaan si fudud u ilaawi doonaa.

Qaybta wax-akhriska waxay iila muuqataa mid aan faa'iido lahayn, mar haddii xataa Aftahanka ah laga yaabo inay jiraan dhawr fulin oo halkan ah. Maxaa lagu magacaabaa fasalka? Karaa Akhri Kaydka Dambe, laakiin si template ah Repository wuxuu horey u lahaa wax yar oo khuseeya. Kaliya waad awoodaa Su'aalaha ka dib:

<?php
interface PostQueries
{
    public function getById($id): Post;
    public function getLastPosts();
    public function getTopPosts();
    public function getUserPosts($userId);
}

Ku dhaqangelinta codkarnimada waa wax fudud:

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

Interface-ku waa inuu la xidhiidhaa hirgelinta, tusaale ahaan gudaha Bixiyaha AppService:

<?php
final class AppServiceProvider extends ServiceProvider 
{
    public function register()
    {
        $this->app->bind(PostQueries::class, 
            EloquentPostQueries::class);
    }
}

Fasalkani waa horeba faa'iido leh. Waxa uu garwaaqsadaa mas'uuliyadda isaga oo ka saaraya kantaroolayaasha ama qaybta qaybta. Xakameeyaha waxaa loo isticmaali karaa sidan:

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

Habka PostsController :: LastPosts kaliya codsanaya in la hirgeliyo Su'aalaha Posts oo la shaqeeya. Bixiyaha waanu ku xidhnay Su'aalaha ka dib oo leh fasalka Weydiimaha Codka badan fasalkana waxaa lagu beddeli doonaa kantaroolaha.

Aynu qiyaasno in codsigayagu noqday mid caan ah. Kumanaan isticmaalayaal ah ayaa daqiiqaddiiba bogga ku fura daabacaadyadii ugu dambeeyay. Daabacadaha ugu caansan sidoo kale marar badan ayaa la akhriyaa. Xog-ururintu si fiican uma xamili karaan culaysyadan oo kale, markaa waxay isticmaalaan xal caadi ah - kayd. Marka lagu daro kaydka xogta, sawir xogeed gaar ah ayaa lagu kaydiyaa kaydinta loo habeeyay hawlgalada qaarkood - memcated ama celiyaan.

Caching caching badiyaa ma aha mid adag, laakiin ku hirgalinta EloquentPostQueries maahan mid sax ah (haddii kaliya sababtoo ah Mabda'a Masuuliyad Kaliya). Aad bay dabiici u tahay in la isticmaalo template Qurxinta oo u hirgeli kaydinta sida qurxinta ficilka ugu muhiimsan:

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

    // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ практичСски Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅
}

Iska daa is dhexgalka Repository ee dhisaha. Sababo aan la garanayn, waxay go'aansadeen inay u magacaabaan interface-ka kaydinta Laravel habkan.

Класс CachedPostQueries fuliya kaydinta kaliya. $this->cache->xusuusnow wuxuu hubiyaa in gelitaanku ku jiro kaydka iyo haddii kale, markaas wac dib-u-warcelinta oo u qorta qiimaha la soo celiyay kaydka. Waxa hadhay oo dhan waa in la hirgeliyo fasalkan codsiga. Waxaan u baahanahay dhammaan fasallada codsiga ku jira si aan u codsano hirgelinta interface-ka Su'aalaha ka dib wuxuu bilaabay inuu helo tusaale fasalka CachedPostQueries. Si kastaba ha ahaatee, isaga laftiisa CachedPostQueries dhisuhu waa inuu helaa fasal halbeeg ahaan ah Weydiimaha Codka badanmaadaama aysan shaqayn karin fulin "dhab ah" la'aanteed. Waanu badalnaa Bixiyaha AppService:

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

Dhammaan rabitaankayga waxaa si dabiici ah loogu sifeeyay bixiyaha. Markaa, waxaanu hirgelinay kaydinta codsiyadayada annaga oo qornay hal fasal oo beddelnay qaabaynta weelka. Inta kale ee koodka codsigu isma bedelin.

Dabcan, si buuxda loo hirgeliyo caching, sidoo kale waa lagama maarmaan in la hirgeliyo sharci-darrada si qodobka la tirtiray uusan ku dhejin goobta in muddo ah, laakiin isla markiiba la tirtiro. Laakiin kuwani waa waxyaabo yaryar.

Guntii iyo gabagabadii: Hal ma aannu isticmaalin, laakiin laba hab-raac. Tusaale Kala soocida Mas'uuliyadda Weydiinta Taliska (CQRS) waxay soo jeedinaysaa in si buuxda loo kala saaro akhrinta iyo qorista hawlgallada heerka interface. Isagaan u imid Mabaadi'da Kala soocida Interface, taas oo soo jeedinaysa in aan si xirfad leh u maareeyo hababka iyo mabaadi'da oo aan ka soo qaato midka kale aragti ahaan :) Dabcan, mashruuc kastaa uma baahna sida soo koobidda xulashada hay'adaha, laakiin waxaan kula wadaagi doonaa khiyaamada. horumarinta, waxaad si fudud u abuuri kartaa fasalka Su'aalaha ka dib iyadoo la adeegsanayo habka caadiga ah ee loo maro codkarnimada:

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

    // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
}

Marka baahida kaydinta ay soo baxdo, dhaqdhaqaaq fudud waxaad ku abuuri kartaa interface (ama fasal aan la taaban karin) meeshii fasalkan Su'aalaha ka dib, ku koobi fulintiisa fasalka Weydiimaha Codka badan oo aad nidaamka aan hore u soo sheegay. Inta soo hartay koodka codsigu uma baahna in la beddelo.

Dhammaan xeeladahan oo leh fasallo, is-dhexgalyo, Ku-tiirsanaanta ΠΈ CQRS si faahfaahsan loogu sharaxay Buugayga "Architecture of Complex Web Applications". Waxa kale oo jira xal halxidhaalaha sababta dhammaan fasaladayda tusaalayaasha maqaalkan loogu calaamadeeyay inay yihiin final.

Source: www.habr.com

Add a comment