Anobatsira repositories ane Eloquent?

Svondo rakapera ndakanyora chinyorwa pamusoro pekusabatsira kweRepository template yeEloquent entities, zvisinei, akavimbisa kundiudza kuti ndingaishandisa sei zvishoma kuti zvimunakire. Kuti ndiite izvi, ini ndichaedza kuongorora kuti template iyi inowanzoshandiswa sei mumapurojekiti. Iyo shoma inodiwa seti yenzira dzenzvimbo yekuchengetera:

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

Zvisinei, mumapurojekiti chaiwo, kana zvakasarudzwa kushandisa zvinyorwa, nzira dzekutora zvinyorwa zvinowanzowedzerwa kwavari:

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

Nzira idzi dzinogona kuitwa kuburikidza neEloquent scopes, asi kuwandisa makirasi esangano nebasa rekuzvitora harisi iro zano rakanakisa, uye kuendesa basa iri kune repository makirasi zvinoita kunge zvine musoro. Ndizvo here? Ini ndakanyatso patsanura iyi interface kuita zvikamu zviviri. Chikamu chekutanga chemitoo ichashandiswa mumabasa ekunyora.

Iyo yakajairwa kunyora mashandiro ndeiyi:

  • kuvakwa kwechinhu chitsva uye dambudziko PostRepository::chengetedza
  • PostRepository ::getById, kushandiswa kwesangano uye kudanwa PostRepository::chengetedza
  • zvinonetsa PostRepository::delete

Nyora mashandisirwo usashandise nzira dzekutora. Mumabasa ekuverenga, get* nzira chete dzinoshandiswa. Kana iwe ukaverenga nezve Interface Segregation Principle (tsamba I Π² SOLID), zvino zvichava pachena kuti interface yedu yakakura uye inoita mabasa maviri akasiyana. Yasvika nguva yekuipatsanura nembiri. Nzira getById inodiwa mune ese ari maviri, asi sezvo application ikawedzera kuomarara, kuita kwayo kunosiyana. Izvi tichazviona gare gare. Ndakanyora pamusoro pekusabatsira kwechikamu chekunyora munyaya yapfuura, saka mune ino ini ndichakanganwa nezvazvo.

Chikamu cheKuverenga chinoita sechisina basa kwandiri, nekuti kunyangwe kune Eloquent panogona kunge paine akati wandei maitirwo pano. Chii chokutumidza kirasi? Inogona ReadPostRepository, asi kune template Repository anotova nezvaanoita zvishoma. Unogona chete PostQueries:

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

Kuzviita neEloquent kuri nyore:

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

Iyo interface inofanirwa kuve yakabatana nekuita, semuenzaniso mu AppServiceProvider:

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

Kirasi iyi yatobatsira. Anoona mutoro wake nekurerutsira vangave vatongi kana kirasi yesangano. Mune controller inogona kushandiswa seizvi:

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

Method PostsController::lastPosts ndichingokumbira kuti tiite PostsQueries uye anoshanda nayo. Mumupi watakabatanidza PostQueries nekirasi EloquentPostQueries uye kirasi iyi ichatsiviwa mu controller.

Ngatimbofungidzira kuti application yedu yave kufarirwa zvakanyanya. Zviuru zvevashandisi paminiti inovhura peji ine zvinyorwa zvichangoburwa. Mabhuku anonyanya kufarirwa anoverengwawo kakawanda. Databases haibati mitoro yakadaro zvakanaka, saka vanoshandisa yakajairwa mhinduro - cache. Pamusoro peiyo dhatabhesi, imwe data snapshot inochengeterwa mukuchengetedza yakagadziridzwa kune mamwe mashandiro - memcached kana redis.

Caching logic kazhinji haina kuoma, asi kuishandisa muEloquentPostQueries hakuna kunyatso kurongeka (kana chete nekuti Imwe Yekuremerwa Musimboti) Zvinonyanya kusikwa kushandisa template Decorator uye shandisa caching sekushongedza kwechiito chikuru:

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

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

Rega iyo interface Repository mugadziri. Nechikonzero chisingazivikanwe, vakasarudza kutumidza iyo interface ye caching muLaravel nenzira iyi.

Chikoro CachedPostQueries zvishandiso caching chete. $ iyi-> cache-> rangarira inotarisa kana iyi yekupinda iri mu cache uye kana isiri, wobva wafona callback uye inonyora kukosha kwakadzoserwa kune cache. Chasara kuita kirasi iyi mukushandisa. Isu tinoda makirasi ese ari muapp kukumbira kuitiswa kweiyo interface PostQueries akatanga kugamuchira muenzaniso wekirasi CachedPostQueries. Zvisinei, iye pachake CachedPostQueries muvaki anofanira kugamuchira kirasi separameter EloquentPostQueriessezvo isingashande pasina "chaiyo" kuita. Tinochinja 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);
    }
}

Zvese zvishuwo zvangu zvinotsanangurwa zvakangoitika muanopa. Nekudaro, isu takaita caching yezvikumbiro zvedu nekunyora kirasi imwe chete uye nekuchinja gadziriso yemidziyo. Imwe yasara yekodhi yekushandisa haina kuchinja.

Ehe, kuita zvizere caching, zvinodikanwa zvakare kuita invalidation kuitira kuti chinyorwa chakadzimwa chirege kurembera pane saiti kwenguva yakati, asi chibviswe ipapo. Asi izvi zvinhu zvidiki.

Pazasi mutsara: isu hatina kushandisa imwe, asi maviri matemplate. Muenzaniso Command Query Responsibility Segregation (CQRS) inokurudzira kuparadzanisa zvakakwana kuverenga nekunyora mashandiro padanho rekuonana. Ndakauya kwaari kuburikidza Interface Segregation Principle, izvo zvinoratidza kuti ini ndino shandisa neunyanzvi mapatani nemisimboti uye ndinotora imwe kubva kune imwe se theorem :) Hongu, haisi purojekiti yega yega inoda kubviswa kwakadaro pakusarudza masangano, asi ini ndichagovera hunyengeri newe.Pakutanga danho rekushandisa. kukura, unogona kungogadzira kirasi PostQueries neyakajairwa kuita kuburikidza neEloquent:

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

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

Kana kudiwa kwe caching kuchimuka, nekufamba kuri nyore unogona kugadzira interface (kana abstract kirasi) panzvimbo yekirasi iyi. PostQueries, kopira kushandiswa kwayo kukirasi EloquentPostQueries uye enda kune chirongwa chandatsanangura pakutanga. Imwe yasara yekodhi yekushandisa haidi kuchinjwa.

Ese manomano aya ane makirasi, mainterfaces, Kuvimbika jekiseni ΠΈ CQRS inotsanangurwa zvakadzama mu bhuku rangu "Architecture yeComplex Web Applications". Kune zvakare mhinduro kuchirahwe nei makirasi angu ese mumienzaniso yechinyorwa ichi akamakwa seyekupedzisira.

Source: www.habr.com

Voeg