Nā waihona waiwai me Eloquent?

I kēlā pule aku nei ua kākau wau ʻatikala e pili ana i ka pono ʻole o ka waihona waihona no nā hui Eloquent, akā naʻe, ua hoʻohiki ʻo ia e haʻi mai iaʻu pehea e hoʻohana hapa ai i kāna pono. No ka hana ʻana i kēia, e hoʻāʻo wau e nānā i ke ʻano o ka hoʻohana maʻamau o kēia template i nā papahana. ʻO ka palena liʻiliʻi i koi ʻia no kahi waihona:

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

Eia nō naʻe, i nā papahana maoli, inā ua hoʻoholo ʻia e hoʻohana i nā waihona, hoʻohui pinepine ʻia nā ala no ka hoʻihoʻi ʻana i nā moʻolelo iā lākou:

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

Hiki ke hoʻokō ʻia kēia mau ʻano ma o ka Eloquent scopes, akā ʻo ka hoʻonui ʻana i nā papa hui me ke kuleana o ke kiʻi ʻana iā lākou iho ʻaʻole ia ka manaʻo maikaʻi loa, a ʻo ka neʻe ʻana i kēia kuleana i nā papa waihona me he mea lā. Pela anei? Ua hoʻokaʻawale au i kēia interface i ʻelua ʻāpana. E hoʻohana ʻia ka hapa mua o nā ʻano hana i nā hana kākau.

ʻO ka hana kākau maʻamau:

  • ke kūkulu ʻana i kahi mea hou a me ka paʻakikī PostRepository:: mālama
  • PostRepository::getById, hoʻopunipuni a me ke kāhea ʻana PostRepository:: mālama
  • ka pahuhopu PostRepository:: holoi

ʻAʻole hoʻohana nā hana kākau i nā ala kiʻi. Ma nā hana heluhelu, hoʻohana wale ʻia nā ala get*. Inā heluhelu ʻoe e pili ana Ke Kumu Hoʻokaʻawale Interface (leka I в HOLOMINA), a laila e ʻike ʻia he nui loa kā mākou interface a hana i ʻelua mau kuleana like ʻole. ʻO ka manawa kēia e puunaue i ʻelua. ʻano hana getById pono i nā mea ʻelua, akā i ka lilo ʻana o ka noi i mea paʻakikī, e ʻokoʻa kāna hoʻokō. E ʻike mākou i kēia ma hope iki. Ua kākau wau e pili ana i ka pono ʻole o ka ʻāpana kākau ma kahi ʻatikala ma mua, no laila ma kēia mea e poina wale ai au.

ʻAʻole he mea ʻole ka ʻāpana Heluhelu iaʻu, ʻoiai no ka Eloquent aia kekahi mau hoʻokō ma aneʻi. He aha ka inoa o ka papa? Hiki ReadPostRepository, akā i ke kumu hoʻohālike Ka Hale Paʻi ua liʻiliʻi kona pili. Hiki iā ʻoe wale nō PostQueries:

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

He mea maʻalahi ka hoʻokō ʻana me 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();
    }
}

Pono e pili ka interface me ka hoʻokō, no ka laʻana ma AppServiceProvider:

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

Pono kēia papa. Hoʻomaopopo ʻo ia i kāna kuleana ma ka hoʻokuʻu ʻana i nā mea hoʻokele a i ʻole ka papa hui. I loko o kahi mea hoʻoponopono hiki ke hoʻohana ʻia e like me kēia:

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

Palapala PostsController::lastPosts e noi wale ana i kekahi hoʻokō PostsQueries a hana pū me ia. Ma ka mea hoʻolako a mākou i hoʻopili ai PostQueries me ka papa EloquentPostQueries a e hoʻololi ʻia kēia papa i ka mea hoʻoponopono.

E noʻonoʻo kākou ua kaulana loa kā mākou noi. ʻO nā kaukani mea hoʻohana i kēlā me kēia minuke e wehe i ka ʻaoʻao me nā puke hou loa. Heluhelu pinepine ʻia nā puke kaulana loa. ʻAʻole mālama maikaʻi nā waihona i kēlā mau ukana, no laila hoʻohana lākou i kahi hopena maʻamau - kahi cache. Ma waho aʻe o ka waihona, mālama ʻia kekahi kiʻi ʻikepili i loko o kahi waihona i hoʻopaʻa ʻia no kekahi mau hana - memcached ai ole ia, ʻulaʻula.

ʻAʻole paʻakikī ka hoʻopaʻa ʻana i ka logic, akā ʻaʻole pololei loa ka hoʻokō ʻana iā ia ma EloquentPostQueries (inā wale nō Kumumanaʻo kuleana kuleana hoʻokahi). He mea maʻamau ka hoʻohana ʻana i ka laʻana ʻĀina a hoʻokō i ka caching i mea hoʻonani no ka hana nui:

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

    // другие методы практически такие же
}

E haʻalele i ke kikowaena Ka Hale Paʻi i ka mea hana. No kekahi kumu i ʻike ʻole ʻia, ua hoʻoholo lākou e inoa i ka interface no ka caching ma Laravel ma kēia ala.

Papa CachedPostQueries hoʻokomo i ka hoʻokomo wale ʻana. $this->cache->hoʻomanaʻo e nānā inā aia kēia komo i loko o ka waihona a inā ʻaʻole, a laila e kāhea i ka callback a kākau i ka waiwai i hoʻihoʻi ʻia i ka cache. ʻO nā mea i koe e hoʻokō i kēia papa i loko o ka noi. Pono mākou i nā papa āpau i ka noi e noi i kahi hoʻokō o ka interface PostQueries hoʻomaka ka loaʻa ʻana o kahi laʻana o ka papa CachedPostQueries. Eia naʻe, ʻo ia iho CachedPostQueries pono e loaʻa i ka mea kūkulu hale kahi papa ma ke ʻano he ʻāpana EloquentPostQueriesno ka mea ʻaʻole hiki ke hana me ka ʻole o ka hoʻokō "maoli". Hoʻololi mākou 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);
    }
}

Ua wehewehe maoli ʻia kaʻu mau makemake a pau i ka mea hoʻolako. No laila, ua hoʻokō mākou i ka cache no kā mākou mau noi ma ke kākau ʻana i hoʻokahi papa a hoʻololi i ka hoʻonohonoho pahu. ʻAʻole i loli ke koena o ke code noi.

ʻOiaʻiʻo, no ka hoʻokō piha ʻana i ka caching, pono nō hoʻi e hoʻokō i ka invalidation i ʻole e kau ka ʻatikala i holoi ʻia ma ka pūnaewele no kekahi manawa, akā holoi koke ʻia. Akā he mau mea liʻiliʻi kēia.

Ke laina lalo: ʻaʻole mākou i hoʻohana i hoʻokahi, akā ʻelua mau mamana. Laʻana ʻO ka hoʻokaʻawale ʻana i ke kuleana nīnau nīnau (CQRS) manaʻo ʻo ia e hoʻokaʻawale loa i nā hana heluhelu a kākau ma ka pae interface. Ua hele au iā ia ma o Ke Kumu Hoʻokaʻawale Interface, ʻo ia ka mea e hōʻike ana e hoʻomaʻamaʻa akamai wau i nā mamana a me nā loina a loaʻa kekahi mai kekahi ma ke ʻano he theorem :) ʻOiaʻiʻo, ʻaʻole pono kēlā me kēia papahana i kahi abstraction no ke koho ʻana i nā hui, akā e kaʻana aku au i ka hoʻopunipuni me ʻoe. hoʻomohala, hiki iā ʻoe ke hana i kahi papa PostQueries me ka hoʻokō maʻamau ma o Eloquent:

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

    // другие методы
}

Ke kū mai ka pono no ka caching, me kahi neʻe maʻalahi hiki iā ʻoe ke hana i kahi interface (a i ʻole ka papa abstract) ma kahi o kēia papa. PostQueries, kope i kona hoʻokō ʻana i ka papa EloquentPostQueries a hele i ka papahana aʻu i wehewehe mua ai. ʻAʻole pono ke hoʻololi ʻia ke koena o ke code noi.

ʻO kēia mau hana hoʻopunipuni āpau me nā papa, nā interface, Pākuʻi dependence и CQRS wehewehe kikoʻī ma kaʻu puke "Hoʻolālā o nā noi pūnaewele paʻakikī". Aia kekahi hoʻonā i ka nane ke kumu i kaha ʻia ai kaʻu mau papa a pau i nā laʻana no kēia ʻatikala he hope loa.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka