Zosungirako zothandiza ndi Eloquent?

Mlungu watha ndinalemba Nkhani yokhudzana ndi kupanda pake kwa template ya Repository ya mabungwe olankhula bwino, komabe, adandilonjeza kundiuza momwe ndingagwiritsire ntchito pang'ono kuti zimupindulitse. Kuti ndichite izi, ndiyesera kusanthula momwe template iyi imagwiritsidwira ntchito nthawi zambiri pama projekiti. Njira zochepa zomwe zimafunikira posungira:

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

Komabe, m'mapulojekiti enieni, ngati adaganiza zogwiritsa ntchito nkhokwe, njira zopezera zolemba nthawi zambiri zimawonjezeredwa kwa iwo:

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

Njirazi zitha kukhazikitsidwa kudzera m'magawo omveka bwino, koma kudzaza magulu omwe ali ndi udindo wodzitenga okha si lingaliro labwino kwambiri, ndipo kusamutsa udindowu kumakalasi osungirako zinthu kumakhala koyenera. Ndi choncho? Ine makamaka zowoneka anagawa mawonekedwe awa mu magawo awiri. Gawo loyamba la njirazi lidzagwiritsidwa ntchito polemba ntchito.

Standard kulemba ntchito ndi:

  • kupanga chinthu chatsopano ndi zovuta PostRepository::sunga
  • PostRepository ::getById, chinyengo cha bungwe ndi kuitana PostRepository::sunga
  • zovuta PostRepository::fufuta

Olemba ntchito musagwiritse ntchito njira zokokera. Powerengera, njira za get* zokha ndizomwe zimagwiritsidwa ntchito. Ngati mukuwerenga za Mfundo Yopatukana ya Interface (kalata I Π² OLIMBITSA), pamenepo zidzaonekeratu kuti mawonekedwe athu ndi aakulu kwambiri ndipo amachita maudindo awiri osiyana. Yakwana nthawi yogawaniza awiri. Njira getById ndizofunikira zonse ziwiri, koma pamene ntchitoyo ikukhala yovuta kwambiri, machitidwe ake amasiyana. Tidzawona izi posachedwa. Ndinalemba za kupanda pake kwa gawo lolemba m'nkhani yapitayi, kotero mu iyi ndingoyiwala za izo.

Gawo la Read likuwoneka kwa ine kukhala lopanda ntchito, chifukwa ngakhale kwa Eloquent pakhoza kukhala zochitika zingapo pano. Kutchula kalasi? Mutha ReadPostRepository, koma ku template Repository ali ndi zofunikira pang'ono. Mutha basi PostQueries:

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

Kukhazikitsa ndi Eloquent ndikosavuta:

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

Chiwonetserocho chiyenera kugwirizana ndi kukhazikitsa, mwachitsanzo mu AppServiceProvider:

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

Kalasi iyi ndiyothandiza kale. Amazindikira udindo wake pochotsa olamulira kapena gulu la mabungwe. Mu controller itha kugwiritsidwa ntchito motere:

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

Njira PostsController::lastPosts ndikungopempha kukhazikitsa PostsQueries ndikugwira nawo ntchito. Mu wopereka tinalumikizana PostQueries ndi class EloquentPostQueries ndipo kalasi iyi idzalowetsedwa m'malo mwa wowongolera.

Tiyerekeze kuti pulogalamu yathu yatchuka kwambiri. Ogwiritsa ntchito zikwizikwi pamphindi amatsegula tsambalo ndi zofalitsa zaposachedwa. Zofalitsa zodziwika kwambiri zimawerengedwanso pafupipafupi. Ma database samagwira bwino ntchito zotere, chifukwa chake amagwiritsa ntchito njira yokhazikika - posungira. Kuphatikiza pa database, chithunzithunzi china cha data chimasungidwa kuti chisungidwe chokongoletsedwa ndi ntchito zina - memcached kapena redis.

Mfundo zosungira nthawi zambiri sizikhala zovuta, koma kuziyika mu EloquentPostQueries sizolondola (ngati kokha chifukwa Mfundo Yodalirika Yokha). Ndizachilengedwe kwambiri kugwiritsa ntchito template Wokongoletsa ndikugwiritsa ntchito caching ngati chokongoletsera pazochita zazikulu:

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

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

Musanyalanyaze mawonekedwe Repository mu omanga. Pazifukwa zosadziwika, adasankha kutchula mawonekedwe a caching ku Laravel motere.

Kalasi CachedPostQueries zida posungira yekha. $izi-> cache->kumbukirani imayang'ana ngati cholemberachi chili mu cache ndipo ngati sichoncho, ndiye kuti muyimbirenso ndikulemba mtengo womwe wabwezedwa ku cache. Chotsalira ndikukhazikitsa kalasi iyi muzofunsira. Timafunikira makalasi onse omwe ali mu pulogalamuyo kuti apemphe kukhazikitsidwa kwa mawonekedwe PostQueries anayamba kulandira chitsanzo cha kalasi CachedPostQueries. Komabe, iye mwini CachedPostQueries womanga ayenera kulandira kalasi ngati chizindikiro EloquentPostQuerieschifukwa sichingagwire ntchito popanda kukhazikitsa "zenizeni". Timasintha 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);
    }
}

Zofuna zanga zonse zafotokozedwa mwachilengedwe mwa wopereka. Chifukwa chake, tidakhazikitsa caching pazopempha zathu pongolemba kalasi imodzi ndikusintha kasinthidwe kachidebe. Khodi yotsalayo sinasinthe.

Inde, kuti mugwiritse ntchito caching mokwanira, m'pofunikanso kukhazikitsa zosavomerezeka kuti nkhani yochotsedwayo isapachikidwa pa malo kwa nthawi ndithu, koma imachotsedwa nthawi yomweyo. Koma izi ndi zinthu zazing'ono.

Mfundo yofunika: sitinagwiritse ntchito imodzi, koma ma templates awiri. Chitsanzo Kugawikana kwa Command Query Responsibility (CQRS) akufuna kulekanitsa kwathunthu kuwerenga ndi kulemba ntchito pa mawonekedwe mlingo. Ndinafika kwa iye Mfundo Yopatukana ya Interface, zomwe zikusonyeza kuti ndimagwiritsa ntchito mwaluso machitidwe ndi mfundo ndikutengera chimodzi kuchokera ku chimzake ngati chiphunzitso :) Zoonadi, si polojekiti iliyonse yomwe imafunikira chidziwitso chotere posankha mabungwe, koma ndikugawana nanu zachinyengo. chitukuko, mutha kungopanga kalasi PostQueries ndikukhazikitsa mwachizolowezi kudzera pa Eloquent:

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

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

Pakafunika caching, ndi kusuntha kosavuta mutha kupanga mawonekedwe (kapena abstract class) m'malo mwa kalasi iyi. PostQueries, koperani kukhazikitsidwa kwake ku kalasi EloquentPostQueries ndikupita ku chiwembu chomwe ndafotokoza kale. Nambala yotsalayo sikufunika kusinthidwa.

Zanzeru zonsezi ndi makalasi, zolumikizirana, Jekeseni Wodalira ΠΈ Mtengo wa CQRS zofotokozedwa mwatsatanetsatane mu buku langa "Architecture of Complex Web Applications". Palinso yankho lamwambi chifukwa chake makalasi anga onse m'zitsanzo za nkhaniyi adalembedwa kuti ndi omaliza.

Source: www.habr.com

Kuwonjezera ndemanga