Awọn ibi ipamọ ti o wulo pẹlu Olokiki?

Ose ti mo ti kowe Nkan nipa aila-nfani ti awoṣe Ibi-ipamọ fun awọn nkan ti o loye, sibẹsibẹ, o ṣe ileri lati sọ fun mi bi o ṣe le lo ni apakan si anfani rẹ. Lati ṣe eyi, Emi yoo gbiyanju lati ṣe itupalẹ bi a ṣe nlo awoṣe yii nigbagbogbo ni awọn iṣẹ akanṣe. Eto ti o kere julọ ti o nilo fun ibi ipamọ kan:

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

Sibẹsibẹ, ni awọn iṣẹ akanṣe gidi, ti o ba pinnu lati lo awọn ibi ipamọ, awọn ọna fun gbigba awọn igbasilẹ nigbagbogbo ni afikun si wọn:

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

Awọn ọna wọnyi le ṣe imuse nipasẹ awọn iwọn Olokiki, ṣugbọn ikojọpọ awọn kilasi nkan ti o pọju pẹlu ojuse ti mimu ara wọn kii ṣe imọran ti o dara julọ, ati gbigbe ojuse yii si awọn kilasi ibi ipamọ dabi ọgbọn. Ṣe bẹ bẹ? Mo ni pato oju pin wiwo yii si awọn ẹya meji. Apa akọkọ ti awọn ọna yoo ṣee lo ni awọn iṣẹ kikọ.

Iṣiṣẹ kikọ boṣewa jẹ:

  • ikole ti ohun titun ati ki o ipenija PostRepository :: fipamọ
  • PostRepository :: getById, nkankan ifọwọyi ati summoning PostRepository :: fipamọ
  • ipenija PostRepository:: parẹ

Awọn iṣẹ ṣiṣe kikọ ko lo awọn ọna gbigbe. Ninu awọn iṣẹ kika, awọn ọna gba * nikan ni a lo. Ti o ba ka nipa Ni wiwo Iyapa Ilana (lẹta I в SOLID), lẹhinna o yoo han gbangba pe wiwo wa tobi ju ati ṣe o kere ju awọn ojuse oriṣiriṣi meji. O to akoko lati pin si meji. Ọna gbaById jẹ pataki ninu awọn mejeeji, ṣugbọn bi ohun elo ṣe di eka sii, awọn imuse rẹ yoo yatọ. A yoo rii eyi diẹ sẹhin. Mo kowe nipa aila-nfani ti apakan kikọ ninu nkan ti tẹlẹ, nitorinaa ninu eyi Emi yoo gbagbe nipa rẹ.

Apakan kika dabi si mi kii ṣe asan, nitori paapaa fun Eloquen ọpọlọpọ awọn imuṣẹ le wa nibi. Kini lati lorukọ kilasi naa? Le KaPostRepository, ṣugbọn si awọn awoṣe Atunjade o si tẹlẹ ni o ni kekere ibaramu. O le kan Awọn ibeere ifiweranṣẹ:

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

Ṣiṣe pẹlu Eloquent jẹ ohun rọrun:

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

Ni wiwo gbọdọ wa ni nkan ṣe pẹlu imuse, fun apẹẹrẹ ni AppService Olupese:

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

Kilasi yii ti wulo tẹlẹ. Ó mọ ojúṣe rẹ̀ nípa yíyọ yálà àwọn olùdarí tàbí kíláàsì nǹkan kan. Ninu oluṣakoso o le ṣee lo bi eleyi:

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

Ọna PostsController :: kẹhinPosts kan béèrè fun diẹ ninu awọn imuse Awọn ibeere ifiweranṣẹ ati ṣiṣẹ pẹlu rẹ. Ninu olupese ti a ti sopọ Awọn ibeere ifiweranṣẹ pẹlu kilasi EloquentPostQueries ati pe kilasi yii yoo rọpo sinu oludari.

Jẹ ki a fojuinu pe ohun elo wa ti di olokiki pupọ. Ẹgbẹẹgbẹrun awọn olumulo ni iṣẹju kan ṣii oju-iwe pẹlu awọn atẹjade tuntun. Awọn atẹjade olokiki julọ ni a tun ka ni igbagbogbo. Awọn apoti isura infomesonu ko mu iru awọn ẹru bẹ daradara, nitorinaa wọn lo ojutu boṣewa - kaṣe kan. Ni afikun si ibi ipamọ data, aworan data kan ti wa ni ipamọ ni iṣapeye fun awọn iṣẹ ṣiṣe kan - memcached tabi redis.

Imọye caching nigbagbogbo kii ṣe idiju, ṣugbọn imuse rẹ ni EloquentPostQueries kii ṣe deede (ti o ba jẹ nitori nikan Ilana Ojúṣe Kan). O jẹ adayeba pupọ diẹ sii lati lo awoṣe kan Oluṣọṣọ ati imuse caching bi ohun ọṣọ fun iṣe akọkọ:

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

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

Foju ni wiwo Atunjade ninu awọn Constructor. Fun idi kan ti a ko mọ, wọn pinnu lati lorukọ wiwo fun caching ni Laravel ni ọna yii.

Класс CachedPostQueries mu ṣiṣẹ caching nikan. $this->cache->ranti ṣayẹwo boya titẹsi yii wa ninu kaṣe ati bi ko ba ṣe bẹ, lẹhinna pe ipe pada ki o kọ iye ti o pada si kaṣe naa. Gbogbo ohun ti o ku ni lati ṣe kilaasi yii sinu ohun elo naa. A nilo gbogbo awọn kilasi ti o wa ninu ohun elo lati beere imuse ti wiwo naa Awọn ibeere ifiweranṣẹ bẹrẹ lati gba apẹẹrẹ ti kilasi naa CachedPostQueries. Sibẹsibẹ, on tikararẹ CachedPostQueries Constructor gbọdọ gba a kilasi bi paramita EloquentPostQueriesniwon o ko le ṣiṣẹ lai a "gidi" imuse. A yipada AppService Olupese:

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

Gbogbo mi lopo lopo ti wa ni oyimbo nipa ti a sapejuwe ninu awọn olupese. Nitorinaa, a ṣe imuse caching fun awọn ibeere wa nikan nipa kikọ kilasi kan ati yiyipada atunto eiyan naa. Iyokù koodu ohun elo ko yipada.

Nitoribẹẹ, lati ṣe imuse caching ni kikun, o tun jẹ dandan lati ṣe imuse aibikita ki nkan ti paarẹ ko ni idorikodo lori aaye naa fun igba diẹ, ṣugbọn paarẹ lẹsẹkẹsẹ. Ṣugbọn awọn nkan kekere ni awọn wọnyi.

Laini isalẹ: a ko lo ọkan, ṣugbọn awọn awoṣe meji. Apeere Pipin Ojuse Ibeere Aṣẹ (CQRS) tanmo lati patapata ya kika ati kọ mosi ni wiwo ipele. Mo ti de ọdọ rẹ nipasẹ Ni wiwo Iyapa Ilana, eyi ti o ni imọran pe Mo fi ọgbọn ṣe afọwọyi awọn ilana ati awọn ilana ati ki o gba ọkan lati ekeji gẹgẹbi imọran :) Nitoribẹẹ, kii ṣe gbogbo iṣẹ akanṣe nilo iru abstraction fun yiyan awọn nkan, ṣugbọn emi yoo pin ẹtan naa pẹlu rẹ Ni ipele ibẹrẹ ti ohun elo. idagbasoke, o le jiroro ni ṣẹda a kilasi Awọn ibeere ifiweranṣẹ pẹlu imuse deede nipasẹ Eloquent:

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

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

Nigbati iwulo fun caching ba dide, pẹlu gbigbe ti o rọrun o le ṣẹda wiwo (tabi kilasi áljẹbrà) ni aaye ti kilasi yii Awọn ibeere ifiweranṣẹ, daakọ imuse rẹ si kilasi naa EloquentPostQueries ki o si lọ si ero ti mo ti ṣalaye tẹlẹ. Iyokù koodu ohun elo ko nilo lati yipada.

Gbogbo awọn ẹtan wọnyi pẹlu awọn kilasi, awọn atọkun, Abẹrẹ igbẹkẹle и CQRS ṣàpèjúwe ninu awọn apejuwe ninu iwe mi “Ile-iṣe ti Awọn ohun elo wẹẹbu eka”. Ojutu tun wa si arosọ idi ti gbogbo awọn kilasi mi ninu awọn apẹẹrẹ fun nkan yii ti samisi bi ipari.

orisun: www.habr.com

Fi ọrọìwòye kun