Wuraren ajiya masu fa'ida tare da mai magana?

Makon da ya gabata na rubuta labarin game da rashin amfani na samfuri na Ma'ajiya don Ƙaƙƙarfan ƙungiyoyi, duk da haka, ya yi alkawarin gaya mani yadda zan yi amfani da shi a wani bangare don amfanin sa. Don yin wannan, zan yi ƙoƙarin nazarin yadda ake amfani da wannan samfuri a cikin ayyukan. Mafi ƙarancin tsarin hanyoyin da ake buƙata don ma'ajiya:

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

Duk da haka, a cikin ayyukan gaske, idan an yanke shawarar yin amfani da ma'ajiyar, ana ƙara hanyoyin da za a dawo da bayanan zuwa gare su:

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

Ana iya aiwatar da waɗannan hanyoyin ta hanyar dalla-dalla, amma ɗaukar nauyin azuzuwan mahalli tare da alhakin ɗauko kansu ba shine mafi kyawun ra'ayi ba, kuma motsa wannan alhakin zuwa azuzuwan ajiya yana da ma'ana. Shin haka ne? Na musamman gani na raba wannan haɗin gwiwa zuwa kashi biyu. Za a yi amfani da ɓangaren farko na hanyoyin a cikin ayyukan rubutu.

Daidaitaccen aikin rubutu shine:

  • gina sabon abu da kalubale Gidan ajiya na baya ::ajiye
  • PostRepository::getById, magudin mahalli da kiraye-kirayen Gidan ajiya na baya ::ajiye
  • kalubale PostRepository:: share

Ayyukan rubuta ba sa amfani da hanyoyin debo. A cikin ayyukan karantawa, hanyoyin samun* kawai ake amfani da su. Idan kun karanta game da Ƙa'idar Rarraba Interface (harafi I в SOLID), sa'an nan zai bayyana a fili cewa mu interface yana da girma da yawa kuma yana aiwatar da aƙalla ayyuka biyu daban-daban. Lokaci ya yi da za a raba shi biyu. Hanya samunById wajibi ne a cikin duka biyun, amma yayin da aikace-aikacen ya zama mafi rikitarwa, aiwatarwa zai bambanta. Za mu ga wannan a nan gaba kadan. Na rubuta game da rashin amfani na sashin rubutun a cikin labarin da ya gabata, don haka a cikin wannan kawai zan manta game da shi.

Bangaren Karatu a gare ni ba shi da amfani sosai, tunda har ma ga mai magana ana iya aiwatarwa da yawa a nan. Me za a sa suna ajin? Can KaratuPostRepository, amma ga samfur mangaza ya riga yana da ɗan dacewa. Kuna iya kawai Tambayar Tambaya:

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

Aiwatar da shi da elloquent abu ne mai sauƙi:

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

Dole ne a haɗa haɗin haɗin gwiwa tare da aiwatarwa, misali a cikin AppServiceMai ba da sabis:

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

Wannan ajin ya riga ya zama mai amfani. Ya fahimci alhakinsa ta hanyar sauke ko dai masu sarrafawa ko ajin mahallin. Ana iya amfani da shi a cikin Controller kamar haka:

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

Hanyar PostsController :: LastPosts kawai neman aiwatarwa Tambayoyi na Posts kuma yana aiki da shi. A cikin mai bayarwa mun haɗa Tambayar Tambaya da class Tambayoyi Masu Bugawa kuma wannan ajin za a musanya shi a cikin mai sarrafawa.

Bari mu yi tunanin cewa aikace-aikacen mu ya zama sananne sosai. Dubban masu amfani a minti daya suna buɗe shafin tare da sabbin wallafe-wallafe. Ana kuma karanta fitattun wallafe-wallafen sau da yawa. Databases ba sa ɗaukar irin waɗannan nauyin da kyau, don haka suna amfani da daidaitaccen bayani - cache. Baya ga ma'ajin bayanai, ana adana takamammen hoton bayanan a cikin ma'ajiyar da aka inganta don wasu ayyuka - memori ko sake dubawa.

Ma'anar caching yawanci ba mai rikitarwa bane, amma aiwatar da shi a cikin EloquentPostQueries ba daidai bane (idan kawai saboda Ka'idar Nauyi daya). Ya fi na halitta amfani da samfuri Mai yin ado da aiwatar da caching azaman kayan ado don babban aikin:

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

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

Yi watsi da abin dubawa mangaza a cikin ginin gini. Don wasu dalilai da ba a san su ba, sun yanke shawarar sanya sunan mahaɗin don caching a Laravel ta wannan hanyar.

Класс CachedPostQueries aiwatar da caching kawai. $this->cache->tuna duba ko wannan shigarwar tana cikin cache kuma idan ba haka ba, sai a kira sake kira kuma ya rubuta ƙimar da aka mayar zuwa cache. Abin da ya rage shi ne aiwatar da wannan ajin cikin aikace-aikacen. Muna buƙatar duk nau'ikan da ke cikin aikace-aikacen don neman aiwatar da mu'amala Tambayar Tambaya ya fara karbar misalin ajin CachedPostQueries. Duk da haka, shi da kansa CachedPostQueries dole ne mai ginin ya karɓi aji a matsayin siga Tambayoyi Masu Bugawatun da ba zai iya aiki ba tare da aiwatar da "ainihin" ba. Muna canzawa AppServiceMai ba da sabis:

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

Dukkan buri na an bayyana su ta zahiri a cikin mai bayarwa. Don haka, mun aiwatar da caching don buƙatunmu kawai ta hanyar rubuta aji ɗaya da canza tsarin kwantena. Sauran lambar aikace-aikacen ba ta canza ba.

Tabbas, don aiwatar da caching cikakke, kuma dole ne a aiwatar da ɓarna don kada labarin da aka goge ya rataya a kan rukunin yanar gizon na ɗan lokaci, amma an share shi nan da nan. Amma waɗannan ƙananan abubuwa ne.

Ƙashin ƙasa: ba mu yi amfani da ɗaya ba, amma samfuri guda biyu. Misali Rarraba Alhakin Tambayoyin Umurni (CQRS) ya ba da shawarar raba gaba ɗaya karantawa da rubuta ayyuka a matakin dubawa. Na zo masa ta hanyar Ƙa'idar Rarraba Interface, wanda ke ba da shawara cewa na iya sarrafa tsari da ka'idoji da fasaha kuma in samo ɗaya daga ɗayan a matsayin ka'idar :) Tabbas, ba kowane aikin yana buƙatar irin wannan abstraction don zaɓar ƙungiyoyi ba, amma zan raba dabara tare da ku. ci gaba, zaku iya ƙirƙirar aji kawai Tambayar Tambaya tare da aiwatarwa na yau da kullun ta hanyar Eloquent:

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

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

Lokacin da buƙatar caching ta taso, tare da sauƙi mai sauƙi za ku iya ƙirƙirar keɓancewa (ko aji mai ƙima) a madadin wannan ajin. Tambayar Tambaya, kwafi aiwatar da shi zuwa aji Tambayoyi Masu Bugawa kuma ku tafi makircin da na bayyana a baya. Sauran lambar aikace-aikacen baya buƙatar canzawa.

Duk waɗannan dabaru tare da azuzuwan, musaya, Allurar Dogaro и CQRS aka bayyana dalla-dalla a ciki littafina "Architecture of Complex Web Applications". Akwai kuma mafita ga kacici-kacici dalilin da ya sa duk azuzuwan na a cikin misalan wannan labarin an yi musu alama a matsayin ƙarshe.

source: www.habr.com

Add a comment