O fale teu aoga ma Eloquent?

O le vaiaso talu ai na ou tusia ai tusiga e uiga i le le aoga o le Repository template mo Eloquent entities, peitaʻi, na ia folafola mai e taʻu mai iā te aʻu pe faapefea ona faaaogā se vaega mo lona lelei. Ina ia faia lenei mea, o le a ou taumafai e iloilo pe faʻafefea ona faʻaaogaina lenei faʻataʻitaʻiga i galuega faatino. Ole seti aupito maualalo ole mana'omia mo se fale teu oloa:

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

Ae ui i lea, i galuega moni, pe afai na filifili e faʻaaoga fale teu oloa, o metotia mo le toe maua mai o faʻamaumauga e masani ona faʻaopoopoina ia i latou:

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

O nei metotia e mafai ona faʻatinoina e ala i le Eloquent scopes, ae o le faʻateleina o vasega faʻalapotopotoga ma le tiute o le aumaia o latou lava e le o se manatu sili lea, ma o le faʻanofoina o lenei tiute i vasega teu oloa e foliga mai e talafeagai. E fa'apea? Na ou vaʻaia faʻapitoa lenei faʻaoga i ni vaega se lua. O le vaega muamua o metotia o le a faʻaaogaina i galuega tusitusi.

O le galuega tusitusi masani o le:

  • fausiaina o se mea fou ma luitau PostRepository::save
  • PostRepository::getById, fa'aogaina ma le vala'au PostRepository::save
  • se luitau PostRepository:: tape

O galuega tusitusi e le fa'aogaina auala e aumai ai. I fa'agaioiga faitau, na'o le get* metotia e fa'aaogaina. Afai e te faitau e uiga i Fa'avae Fa'avae Va'aiga (tusi I в SOLID), ona manino ai lea o la tatou atinaʻe e telē tele ma faʻatino a itiiti ifo ma le lua ni tiute eseese. Ua oo i le taimi e vaevae ai i le lua. Metotia getById e manaʻomia i mea uma e lua, ae a oʻo ina sili atu le lavelave o le talosaga, o le a eseese ona faʻatinoga. O le a tatou vaʻai i lenei mea i se taimi mulimuli ane. Na ou tusia e uiga i le le aoga o le vaega tusitusi i se tusiga talu ai, o lea i lenei mea o le a na ona galo ia te au.

O le vaega Faitau e foliga mai ia te aʻu e le aoga tele, talu ai e oʻo lava mo Eloquent atonu e tele faʻatinoga iinei. O le a le igoa e faaigoa ai le vasega? E mafai ReadPostRepository, ae i le mamanu Faletupe ua itiiti sona taua. E mafai lava PostQueries:

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

O le faʻatinoina ma le Eloquent e faigofie lava:

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

E tatau ona fesoʻotaʻi le atinaʻe ma le faʻatinoga, mo se faʻataʻitaʻiga i AppServiceProvider:

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

O lenei vasega ua uma ona aoga. Na te iloa lona tiute e ala i le faʻamatuʻuina atu o le pule poʻo le vasega faʻalapotopotoga. I totonu o se pule e mafai ona faʻaaogaina e pei o lenei:

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

Metotia PostsController::LastPosts na o le talosaga atu mo se faatinoga PostsQueries ma galulue faatasi ai. I le kamupani na matou faʻafesoʻotaʻi PostQueries ma le vasega EloquentPostQueries ma o lenei vasega o le a suia i le pule.

Sei o tatou mafaufau ua matua lauiloa a tatou talosaga. E afe ma afe tagata fa'aoga i minute ta'itasi e tatala le itulau ma lomiga fou. O lomiga sili ona lauiloa e faitau soo foi. O faʻamaumauga e le lelei tele le taulimaina o ia avega, o lea latou te faʻaogaina ai se fofo masani - o se cache. I le faʻaopoopoga i le database, o loʻo teuina se faʻamatalaga faʻamatalaga i totonu o le teuina e sili ona lelei mo nisi gaioiga - memcached poʻo toe fai.

E masani lava e le faigata tele le faʻaogaina o manatu, ae o le faʻatinoina i le EloquentPostQueries e le saʻo (pe a naʻo Nofofua Tiute Mataupu Faavae). E sili atu le masani le faʻaaogaina o se mamanu Tagata teuteu ma fa'atino le caching e fai ma teuteuga mo le gaioiga autu:

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

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

Le amana'ia le fa'aoga Faletupe i le faufale. Mo nisi mafuaaga le iloa, na latou filifili e faaigoa le atinaʻe mo le faʻaogaina i Laravel i lenei auala.

Vasega CachedPostQueries fa'atino na'o le fa'aoga. $this->cache->manatua siaki pe o loʻo i totonu o le cache lenei faʻamatalaga ma afai e leai, ona valaʻau lea i tua ma tusi le tau toe faʻafoʻi i le cache. Pau lava le mea o loʻo totoe o le faʻatinoina o lenei vasega i totonu o le talosaga. Matou te manaʻomia vasega uma i totonu o le talosaga e talosagaina se faʻatinoga o le atinaʻe PostQueries na amata ona maua se faataitaiga o le vasega CachedPostQueries. Ae peitai, o ia lava CachedPostQueries e tatau i le faufale ona maua se vasega o se parakalafa EloquentPostQueriestalu ai e le mafai ona galue e aunoa ma se faʻatinoga "moni". Tatou te sui 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);
    }
}

O oʻu manaʻoga uma o loʻo faʻamatalaina masani i totonu o le kamupani. O lea, na matou faʻatinoina le faʻaogaina o a matou talosaga e ala i le tusiaina o le tasi vasega ma suia le faʻatulagaina o pusa. O le isi vaega o le numera o talosaga e leʻi suia.

O le mea moni, ina ia faʻatinoina atoatoa le caching, e tatau foʻi ona faʻatinoina le faʻaleaogaina ina ia le faʻapipiʻi le mea na tapeina i luga o le saite mo sina taimi, ae faʻamalo vave. Ae o mea laiti nei.

laina pito i lalo: matou te le faʻaaogaina se tasi, ae lua faʻataʻitaʻiga. Fa'ata'ita'iga Tu'ufa'atasiga o Tiutetauave ole Poloaiga (CQRS) e fa'atatau e tu'u'ese'ese atoatoa galuega faitau ma tusitusi i le tulaga fa'aoga. Na ou sau ia te ia e ala mai Fa'avae Fa'avae Va'aiga, lea e taʻu mai ai ou te faʻaogaina ma le atamai mamanu ma mataupu faavae ma maua mai le tasi mai le isi o se aʻoaʻoga :) Ioe, e le o galuega uma e manaʻomia se faʻaogaina mo le filifilia o vaega, ae o le a ou faʻasoa atu le togafiti ia te oe I le amataga o le faʻaoga atinae, e mafai lava ona e fatuina se vasega PostQueries faʻatasi ai ma le faʻatinoga masani e ala i le Eloquent:

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

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

A tulaʻi mai le manaʻoga mo le faʻaogaina, faʻatasi ai ma se gaioiga faigofie e mafai ona e fatuina se atinaʻe (poʻo se vasega faʻapitoa) e suitulaga i lenei vasega PostQueries, kopi lona faatinoga i le vasega EloquentPostQueries ma alu i le polokalame na ou faamatalaina muamua. Ole isi vaega ole tusi talosaga e le mana'omia ona suia.

O nei togafiti uma ma vasega, fesoʻotaʻiga, Tui Faamoemoe и CQRS faamatalaina auiliili i la'u tusi "Fausiaina o Talosaga Upega Tafa'ilagi". E iai fo'i se vaifofo i le tupua pe aisea ua fa'ailoga uma ai a'u vasega i fa'ata'ita'iga mo lenei tala.

puna: www.habr.com

Faaopoopo i ai se faamatalaga