Nga putunga whaihua me te Eloquent?

I tera wiki i tuhi ahau tuhinga mo te koretake o te tauira Repository mo nga hinonga Eloquent, heoi, i oati ia ki te korero mai ki ahau me pehea te whakamahi i tetahi waahanga hei painga mona. Ki te mahi i tenei, ka ngana ahau ki te tātari me pehea e whakamahia ai tenei tauira ki nga kaupapa. Ko te huinga tikanga iti e hiahiatia ana mo te putunga:

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

Heoi, i roto i nga kaupapa tuuturu, mena kua whakatauhia ki te whakamahi i nga putunga, ka taapirihia nga tikanga mo te whakahoki mai i nga rekoata ki a raatau:

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

Ko enei tikanga ka taea te whakatinana ma roto i nga waahanga Eloquent, engari ko te taumaha o nga karaehe hinonga me te kawenga ki te tiki i a raatau ake ehara i te mea pai rawa atu, me te neke i tenei kawenga ki nga karaehe putunga te ahua arorau. He pera ano? I wehea e au tenei atanga kia rua nga wahanga. Ko te waahanga tuatahi o nga tikanga ka whakamahia ki nga mahi tuhi.

Ko te mahinga tuhi paerewa ko:

  • te hanga i tetahi mea hou me te wero PostRepository::tiaki
  • PostRepository::getById, te raweke hinonga me te karanga PostRepository::tiaki
  • wero PostRepository::muku

Ko nga mahi tuhi kaore e whakamahi tikanga tiki. I roto i nga mahi panui, ka whakamahia nga tikanga tiki* anake. Mena ka panui koe mo Kaupapa Whakawehe Atanga (reta I в Tuhinga), katahi ka maarama he nui rawa to maatau atanga me te mahi i nga kawenga rereke e rua. Kua tae ki te wa ki te wehewehe kia rua. Tikanga getById e tika ana i roto i nga mea e rua, engari i te mea ka uaua ake te tono, ka rereke nga whakaritenga. Ka kite tatou i tenei i muri iti nei. I tuhituhi ahau mo te koretake o te waahanga tuhi i roto i te tuhinga o mua, na i tenei ka wareware noa ahau.

Ko te waahanga Panui ki ahau kaore i te tino horihori, na te mea mo te Eloquent he maha nga whakatinanatanga kei konei. He aha te ingoa o te akomanga? Ka taea ReadPostRepository, engari ki te tauira Repository he iti nei tona whai tikanga. Ka taea noa e koe Panui Uiui:

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

Ko te whakatinana me te Eloquent he tino ngawari:

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

Me hono te atanga ki te whakatinanatanga, hei tauira i roto i AppServiceProvider:

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

Kua whai hua tenei karaehe. Ka mohio ia ki tana kawenga ma te whakakore i nga kaiwhakahaere, i te roopu hinonga ranei. I roto i te kaiwhakahaere ka taea te whakamahi penei:

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

Tikanga PostsController::lastPosts tono noa mo etahi whakatinanatanga Panui Uiui me te mahi tahi. I roto i te kaiwhakarato i honoa e matou Panui Uiui me te karaehe EloquentPostQueries a ka whakakapia tenei karaehe ki te kaiwhakahaere.

Whakaarohia kua tino rongonui to maatau tono. He mano nga kaiwhakamahi i ia meneti ka whakatuwhera i te whaarangi me nga panui hou. Ko nga pukapuka tino rongonui ka panuihia i nga wa maha. Kaore e tino pai te whakahaere a nga papaaarangi i nga taumahatanga penei, na reira ka whakamahia he otinga paerewa - he keteroki. I tua atu i te paataka raraunga, ka penapenahia he whakaahua raraunga ki roto i te rokiroki kua arotauhia mo etahi mahi - memcached ranei tukurua.

Ko te arorau keteroki ehara i te mea uaua, engari ko te whakatinana i roto i te EloquentPostQueries kaore i te tino tika (mehemea na te mea Tikanga Kawenga Takitahi). He maamaa noa te whakamahi tauira Kaiwhakapaipai me te whakatinana i te keteroki hei whakapaipai mo te mahi matua:

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

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

Waiho te atanga Repository i roto i te kaihanga. Mo etahi take kaore i mohiotia, i whakatau ratou ki te whakaingoa i te atanga mo te keteroki i Laravel penei.

Класс CachedPostQueries ka whakatinana i te keteroki anake. $this->cache->mahara ka taki mena kei te keteroki tenei urunga, a ki te kore, ka waea atu ki te hokinga mai me te tuhi i te uara i whakahokia ki te keteroki. Ko nga mea e toe ana ko te whakauru i tenei akomanga ki te tono. E hiahia ana matou ki nga karaehe katoa i roto i te tono ki te tono i te whakatinanatanga o te atanga Panui Uiui i timata ki te whiwhi tauira o te karaehe CachedPostQueries. Heoi, ko ia ano CachedPostQueries me whiwhi te kaihanga i tetahi karaehe hei tawhā EloquentPostQueriesno te mea kaore e taea te mahi me te kore he "pono" whakatinanatanga. Ka huri tatou 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);
    }
}

Ko aku hiahia katoa e tino whakaahuahia ana i roto i te kaiwhakarato. No reira, i whakatinanahia e matou te keteroki mo a matou tono ma te tuhi i tetahi akomanga me te whakarereke i te whirihoranga ipu. Ko te toenga o te waehere tono kaore i rereke.

Ko te tikanga, ki te tino whakatinana i te keteroki, he mea tika ano kia whakatinanahia te whakakore kia kore ai te tuhinga kua mukua e whakairihia ki runga i te pae mo etahi wa, engari ka mukua tonu. Engari he mea iti enei.

Rarangi o raro: ehara i te kotahi, engari e rua nga tauira. Tauira Wehenga Kawenga Uiui Tono (CQRS) e whakaaro ana kia tino wehe nga mahi panui me te tuhi i te taumata atanga. I haere mai ahau ki a ia Kaupapa Whakawehe Atanga, e tohu ana kia mohio au ki te raweke i nga tauira me nga maataapono me te whakaputa mai i tetahi mai i tetahi hei kaupapa whakaaro :) Ae ra, kaore nga kaupapa katoa e hiahia ki te tango i nga hinonga, engari ka tohatoha ahau ki a koe. whanaketanga, ka taea e koe te hanga noa i te akomanga Panui Uiui me te whakatinanatanga o mua ma te Eloquent:

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

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

Ka ara ake te hiahia mo te keteroki, ma te mahi ngawari ka taea e koe te hanga i tetahi atanga (te karaehe waitara ranei) hei whakakapi mo tenei karaehe Panui Uiui, kape i tana whakatinanatanga ki te akomanga EloquentPostQueries a haere ki te kaupapa i korerohia e ahau i mua. Ko te toenga o te waehere tono kaore e tika kia whakarereketia.

Ko enei tinihanga katoa me nga karaehe, atanga, Te Weronga Whakaaetanga и CQRS whakaahuatia i roto i te taipitopito i roto i taku pukapuka "Te Hangahanga o nga Taupānga Tukutuku Matatini". He otinga ano mo te kai te take i tohuhia ai aku karaehe katoa i roto i nga tauira mo tenei tuhinga hei whakamutunga.

Source: will.com

Tāpiri i te kōrero