Iindawo zokugcina eziluncedo ezine-Eloquent?

Kwiveki ephelileyo ndibhale Inqaku elimalunga nokungabinamsebenzi kwethempleyithi yeRepository yamaqumrhu aQinisayo, nangona kunjalo, wathembisa ukundixelela indlela yokuyisebenzisa ngokuyinxenye ukuze kungenelwe yena. Ukwenza oku, ndiza kuzama ukuhlalutya indlela le template edla ngokusetyenziswa ngayo kwiiprojekthi. Ubuncinci obufunekayo iseti yeendlela zokugcina:

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

Nangona kunjalo, kwiiprojekthi zokwenyani, ukuba kugqitywe ukusetyenziswa kweendawo zokugcina, iindlela zokufumana iirekhodi zihlala zongezwa kubo:

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

Ezi ndlela zinokuphunyezwa ngeMida yoBuchule, kodwa ukulayishwa ngokugqithisileyo kweeklasi zequmrhu ezinoxanduva lokuzilanda ngokwazo ayilona ngcamango ilungileyo, kwaye ukuhambisa olu xanduva kwiiklasi zogcino kubonakala kunengqiqo. Ngaba kunjalo? Ndahlulahlula ngokubonakalayo le interface ibe ngamacandelo amabini. Inxalenye yokuqala yeendlela iya kusetyenziswa kwimisebenzi yokubhala.

Umsebenzi wokubhala osemgangathweni ngulo:

  • ukwakhiwa kwento entsha kunye nomngeni PostRepository::gcina
  • PostRepository::getById, ukukhohlisa kunye nokubiza iqumrhu PostRepository::gcina
  • umceli mngeni Indawo yokugcina::cima

Ukubhala imisebenzi musa ukusebenzisa iindlela zokulanda. Kwimisebenzi yokufunda, sebenzisa iindlela ze get* kuphela. Ukuba ufunda malunga I-Interface Segregation Principle (ileta I Π² ISOLID), ngoko kuya kucaca ukuba ujongano lwethu lukhulu kakhulu kwaye lwenza ubuncinane uxanduva olubini olwahlukileyo. Lixesha lokuyahlula kabini. Indlela getById iyimfuneko kuzo zombini, kodwa njengoko isicelo siba nzima ngakumbi, ukuphunyezwa kwaso kuya kwahluka. Siza kuyibona kamva oku. Ndabhala malunga nokungabi namsebenzi kwenxalenye yokubhala kwinqaku elidlulileyo, ngoko kule nto ndiza kulibala ngayo.

Inxalenye yokuFunda ibonakala ingenamsebenzi kum, kuba nakwi-Eloquent kunokubakho ukuphunyezwa okuninzi apha. Yintoni ethiya iklasi? Ngaba ReadPostRepository, kodwa kwitemplate Repository sele enomsebenzi omncinci. Unako nje Imibuzo yePost:

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

Ukuyiphumeza nge-Eloquent ilula kakhulu:

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

I-interface kufuneka inxulunyaniswe nokuphunyezwa, umzekelo kwi AppServiceProvider:

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

Le klasi sele iluncedo. Uyaluqonda uxanduva lwakhe ngokukhulula nokuba ngabalawuli okanye udidi lwequmrhu. Kumlawuli ingasetyenziswa ngolu hlobo:

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

Indlela UMlawuli weZithuba::IiPostPosts ndicela nje ukuphunyezwa okuthile IiPostsImibuzo kwaye isebenza nayo. Kumboneleli esiqhagamshelene nawo Imibuzo yePost kunye neklasi EloquentPostQueries kwaye olu didi luya kufakwa endaweni yomlawuli.

Masicinge ukuba isicelo sethu sele sithandwa kakhulu. Amawaka abasebenzisi ngomzuzu avula iphepha ngopapasho lwamva nje. Ezona mpapasho zidumileyo nazo zifundwa rhoqo. Iidatabase aziyiphathi kakuhle imithwalo enjalo, ngoko zisebenzisa isisombululo esiqhelekileyo - i-cache. Ukongeza kwisiseko sedatha, i-snapshot ethile yedatha igcinwa kwindawo yokugcina elungiselelwe imisebenzi ethile - kukhunjulwe okanye redis kwakhona.

Ingqiqo ye-caching iqhele ukuba ayintsokothanga kangako, kodwa ukuyiphumeza kwi-EloquentPostQueries ayilunganga kakhulu (ukuba kungenxa yokuba Umgaqo woXanduva olunye). Kungokwemvelo ngakumbi ukusebenzisa itemplate Umhlobisi kwaye usebenzise i-caching njengohombiso lwesenzo esiphambili:

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

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

Ungaluhoyi ujongano Repository kumakhi. Ngesizathu esingaziwayo, bagqibe kwelokuba babize ujongano lwe-caching eLaravel ngale ndlela.

I klasi CachedPostQueries sebenzisa i-caching kuphela. $ le-> cache-> khumbula ijonga ukuba olungeno lukwindawo efihlakeleyo kwaye ukuba akunjalo, emva koko ufowuna kwakhona kwaye ubhale ixabiso elibuyisiweyo kwindawo yokugcina. Konke okuseleyo kukuphumeza le klasi kwisicelo. Sifuna zonke iiklasi ezikwisicelo ukucela ukuphunyezwa kojongano Imibuzo yePost waqala ukufumana umzekelo weklasi CachedPostQueries. Noko ke, yena ngokwakhe CachedPostQueries umakhi kufuneka afumane iklasi njengeparamitha EloquentPostQuerieskuba ayinakusebenza ngaphandle kokuphunyezwa "kwenyani". Siyatshintsha 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);
    }
}

Yonke iminqweno yam ichazwe ngokwendalo kumboneleli. Ke, siphumeze i-caching yezicelo zethu kuphela ngokubhala iklasi enye kunye nokutshintsha ubumbeko lwesikhongozeli. Eminye ikhowudi yesicelo ayitshintshanga.

Ngokuqinisekileyo, ukuphumeza ngokupheleleyo i-caching, kuyafuneka ukuba kuphunyezwe ukungasebenzi ukwenzela ukuba inqaku elicinyiweyo lingaxhonywa kwisayithi ixesha elithile, kodwa licinywe ngokukhawuleza. Kodwa ezi zizinto ezincinci.

Umgca osezantsi: asizange sisebenzise enye, kodwa iitemplates ezimbini. Isampulu Ulwahlulo loMthandazo woMbuzo (CQRS) iceba ukwahlula ngokupheleleyo imisebenzi yokufunda nokubhala kwinqanaba lojongano. Ndize kuye ngo I-Interface Segregation Principle, ecebisa ukuba ndisebenzise ngobuchule iipateni kunye nemigaqo kwaye ndifumana enye kwenye njengethiyori uphuhliso, ungenza ngokulula iklasi Imibuzo yePost ngokuphunyezwa kwesiqhelo nge-Eloquent:

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

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

Xa kukho imfuneko ye-caching, ngentshukumo elula ungenza ujongano (okanye iklasi engabonakaliyo) endaweni yale klasi. Imibuzo yePost, khuphela ukuphunyezwa kwayo eklasini EloquentPostQueries kwaye uye kwisikimu endisichaze ngaphambili. Eminye ikhowudi yesicelo ayifuni kutshintshwa.

Onke la maqhinga aneeklasi, ujongano, Inaliti yokuxhomekeka ΠΈ CQRS ichazwe ngokweenkcukacha kwi incwadi yam "Uyilo lwezicelo zeWebhu eziyinkimbinkimbi". Kukho nesisombululo kwiqhina lokuba kutheni zonke iiklasi zam kwimizekelo yeli nqaku ziphawulwe njengezokugqibela.

umthombo: www.habr.com

Yongeza izimvo