Amakhosombe awusizo ane-Eloquent?

Ngesonto eledlule ngibhale i-athikili emayelana nokungabi nalusizo kwesifanekiso seNdawo Yendawo kumabhizinisi Ahlakaniphile, nokho, wathembisa ukungitshela ukuthi ngingayisebenzisa kanjani ingxenye ukuze kuzuze yena. Ukwenza lokhu, ngizozama ukuhlaziya ukuthi lesi sifanekiso sivame ukusetshenziswa kanjani kumaphrojekthi. Isethi encane edingekayo yezindlela zendawo yokugcina:

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

Kodwa-ke, kumaphrojekthi wangempela, uma kunqunywe ukusebenzisa amakhosombe, izindlela zokuthola amarekhodi zivame ukungezwa 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);
}

Lezi zindlela zingasetshenziswa ngokusebenzisa izikophu Ezihlakaniphile, kodwa izigaba zebhizinisi ezilayisha ngokweqile ezinomthwalo wemfanelo wokuzilanda akuwona umqondo ongcono kakhulu, futhi ukuhambisa lesi sibopho kumakilasi enqolobane kubonakala kunengqondo. Ingabe kunjalo? Ngihlukanise ngokuqondile lesi sikhombimsebenzisi sibe izingxenye ezimbili. Ingxenye yokuqala yezindlela izosetshenziswa emisebenzini yokubhala.

Umsebenzi wokubhala ojwayelekile uthi:

  • ukwakhiwa kwento entsha kanye nenselelo I-PostRepository::gcina
  • I-PostRepository::getById, ukukhohlisa kwebhizinisi nokubiza I-PostRepository::gcina
  • inselelo I-PostRepository::susa

Ukubhala imisebenzi ungasebenzisi izindlela zokulanda. Emisebenzini yokufunda, kusetshenziswa izindlela ze-Get* kuphela. Uma ufunda mayelana Isimiso Sokuhlukaniswa Kwe-interface (incwadi I Π² SOLID), khona-ke kuzocaca ukuthi isikhombimsebenzisi sethu sikhulu kakhulu futhi senza okungenani izibopho ezimbili ezihlukene. Sekuyisikhathi sokuyihlukanisa kabili. Indlela getById kuyadingeka kukho kokubili, kodwa njengoba uhlelo lokusebenza luba nzima kakhulu, ukusetshenziswa kwalo kuzohluka. Lokhu sizokubona kamuva. Ngibhale ngokungabi namsebenzi kwengxenye yokubhala esihlokweni esedlule, ngakho-ke kulesi ngizovele ngikhohlwe ngakho.

Ingxenye ethi Funda ibonakala ingeyona into engenamsebenzi kangako, ngoba naku-Eloquent kungase kube nokusetshenziswa okuningana lapha. Yini ukubiza ikilasi? Angakwazi FundaPostRepository, kodwa kusifanekiso Igumbi usevele enokuncane okubalulekile. Ungakwazi nje I-PostQueries:

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

Ukukusebenzisa nge-Eloquent kulula 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 kumele ihlotshaniswe nokusetshenziswa, isibonelo ku I-AppServiceProvider:

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

Leli klasi selivele liwusizo. Ubona isibopho sakhe ngokukhulula izilawuli noma isigaba sebhizinisi. Kusilawuli singasetshenziswa kanje:

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

Indlela PostsController::lastPosts ngicela nje ukuqaliswa okuthile OkuthunyelweImibuzo futhi usebenza nayo. Kumhlinzeki esikuxhumanise I-PostQueries ngekilasi EloquentPostQueries futhi lesi sigaba sizofakwa esikhundleni sesilawuli.

Ake sicabange ukuthi uhlelo lwethu lokusebenza seludume kakhulu. Izinkulungwane zabasebenzisi ngomzuzu zivula ikhasi ngokushicilelwe kwakamuva. Izincwadi ezithandwa kakhulu nazo zifundwa kaningi. I-database ayibambi kahle imithwalo enjalo, ngakho-ke isebenzisa isisombululo esivamile - inqolobane. Ngokungeziwe kusizindalwazi, isifinyezo esithile sedatha sigcinwa kwisitoreji esenzelwe imisebenzi ethile - i-memcached noma uphinda.

I-caching logic ngokuvamile ayiyona inkimbinkimbi, kodwa ukuyisebenzisa ku-EloquentPostQueries akulungile kakhulu (uma kungenxa yokuthi Umgomo Womthwalo Owodwa). Kungokwemvelo kakhulu ukusebenzisa isifanekiso Umhlobisi futhi usebenzise ukulondoloza isikhashana njengomhlobiso wesenzo esiyinhloko:

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

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

Ziba isixhumi esibonakalayo Igumbi kumakhi. Ngesizathu esingaziwa, banqume ukuqamba isikhombimsebenzisi se-caching ku-Laravel ngale ndlela.

Класс I-CachedPostQueries sebenzisa i-caching kuphela. $this->cache->khumbula ihlola ukuthi lokhu okufakile kunqolobane yini futhi uma kungenjalo, bese iphinda ishaye ucingo bese ibhala inani elibuyisiwe kunqolobane. Okusele nje ukusebenzisa leli klasi kuhlelo lokusebenza. Sidinga wonke amakilasi ukuthi kuhlelo lokusebenza acele ukuqaliswa kokusetshenziswa kubonwa I-PostQueries waqala ukuthola isibonelo sekilasi I-CachedPostQueries. Nokho, yena ngokwakhe I-CachedPostQueries umakhi kumele athole ikilasi njengepharamitha EloquentPostQueriesngoba ayikwazi ukusebenza ngaphandle kokuqaliswa "kwangempela". Siyashintsha I-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);
    }
}

Zonke izifiso zami zichazwe ngokwemvelo kumhlinzeki. Ngakho-ke, senze i-caching yezicelo zethu kuphela ngokubhala isigaba esisodwa futhi siguqule ukucushwa kwesiqukathi. Enye ikhodi yohlelo lokusebenza ayishintshile.

Yiqiniso, ukuze kusetshenziswe ngokugcwele i-caching, kuyadingeka futhi ukusebenzisa ukungavumelekile ukuze isihloko esisusiwe singalengi kusayithi isikhathi esithile, kodwa sisuswe ngokushesha. Kodwa lezi yizinto ezincane.

Okubalulekile: asisebenzisanga isifanekiso esisodwa, kodwa ezimbili. Isampula I-Command Query Responsibility Segregation (CQRS) iphakamisa ukwehlukanisa ngokuphelele imisebenzi yokufunda nokubhala ezingeni lesixhumi esibonakalayo. Ngize kuye nge Isimiso Sokuhlukaniswa Kwe-interface, okuphakamisa ukuthi ngisebenzise amaphethini nezimiso ngobuhlakani futhi ngithole enye kwenye njengethiyori :) Yebo, akuwona wonke amaphrojekthi adinga lokho kukhishwa ekukhetheni amabhizinisi, kodwa ngizokwabelana nawe ngobuqili. Esigabeni sokuqala sohlelo lokusebenza ukuthuthukiswa, ungamane udale ikilasi I-PostQueries ngokuqaliswa okujwayelekile nge-Eloquent:

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

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

Lapho kuphakama isidingo sokugcinwa kwesikhashana, ngomnyakazo olula ungakha i-interface (noma i-abstract class) esikhundleni saleli klasi. I-PostQueries, kopisha ukuqaliswa kwayo ekilasini EloquentPostQueries futhi uye esikimini engisichaze ekuqaleni. Enye ikhodi yohlelo lokusebenza ayidingi ukushintshwa.

Wonke lawa maqhinga anamakilasi, ukuxhumana, Umjovo Wokuncika ΠΈ I-CQRS kuchazwe ngokuningiliziwe ku incwadi yami "I-Architecture of Complex Web Applications". Kukhona nesixazululo semfumbe ukuthi kungani wonke amakilasi ami ezibonelweni zalesi sihloko amakwe njengawokugcina.

Source: www.habr.com

Engeza amazwana