Taisclanna úsáideacha le Eloquent?

An tseachtain seo caite scríobh mé alt faoi uselessness an teimpléad Stór le haghaidh eintiteas eloquent...., áfach, gheall sé a insint dom conas é a úsáid go páirteach chun a bhuntáiste. Chun seo a dhéanamh, déanfaidh mé iarracht anailís a dhéanamh ar an gcaoi a n-úsáidtear an teimpléad seo de ghnáth i dtionscadail. An tacar íosta modhanna a theastaíonn le haghaidh stór:

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

I bhfíorthionscadail, áfach, má chinntear stórtha a úsáid, is minic a chuirtear modhanna chun taifid a aisghabháil leo:

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

D'fhéadfaí na modhanna seo a chur i bhfeidhm trí scóip Eloquent, ach ní hé an smaoineamh is fearr é ró-ualú ranganna aonáin a bhfuil an fhreagracht orthu iad féin a fháil, agus is cosúil go bhfuil sé loighciúil an fhreagracht seo a aistriú chuig ranganna stórais. An amhlaidh? Roinn mé an comhéadan seo go sonrach ina dhá chuid. Úsáidfear an chéad chuid de na modhanna in oibríochtaí scríbhneoireachta.

Is é an oibríocht scríofa caighdeánach:

  • rud nua agus dúshlán a thógáil PostStór::shábháil
  • Stór Post::getById, ionramháil agus toghairm eintitis PostStór::shábháil
  • dúshlán PostStór::scrios

Ní úsáideann oibríochtaí scríofa modhanna beir. In oibríochtaí léite, ní úsáidtear ach modhanna faigh*. Má léann tú faoi Prionsabal Deighilte Comhéadain (litir I в Soladach), ansin beidh sé soiléir go bhfuil ár gcomhéadan ró-mhór agus go gcomhlíonann sé ar a laghad dhá fhreagracht éagsúla. Tá sé in am é a roinnt ar dhá cheann. Modh getById riachtanach sa dá cheann, ach de réir mar a éiríonn an t-iarratas níos casta, beidh difríocht lena fheidhmiú. Feicfimid é seo beagán níos déanaí. Scríobh mé faoi neamhúsáide na coda scríofa in alt roimhe seo, mar sin sa cheann seo déanfaidh mé dearmad go simplí faoi.

Dealraíonn sé dom nach bhfuil an chuid Read chomh húsáideach sin, mar fiú i gcás Eloquent d’fhéadfadh go mbeadh roinnt feidhmeanna anseo. Cad is ceart a ainmniú don rang? An féidir ReadPostRepository, ach leis an teimpléad Stór níl mórán ábharthacht aige cheana féin. Is féidir leat ach Iarcheisteanna:

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

Tá sé simplí go leor é a chur i bhfeidhm le Eloquent:

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

Ní mór an comhéadan a bheith bainteach leis an gcur i bhfeidhm, mar shampla i AppServiceProvider:

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

Tá an rang seo úsáideach cheana féin. Tuigeann sé a fhreagracht trí faoiseamh a thabhairt do na rialaitheoirí nó don aicme aonáin. I rialtóir is féidir é a úsáid mar seo:

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

Modh Bainisteoir Poist::lastPosts ach ag iarraidh roinnt cur i bhfeidhm PostsQueries agus oibríonn sé leis. Sa soláthraí nasc muid Iarcheisteanna le rang EloquentPostQueries agus cuirfear an aicme seo isteach sa rialtóir.

Samhlóimid go bhfuil an-tóir ar ár n-iarratas. Osclaíonn na mílte úsáideoir in aghaidh an nóiméid an leathanach leis na foilseacháin is déanaí. Léitear na foilseacháin is mó tóir go minic freisin. Ní láimhseálann bunachair shonraí ualaí den sórt sin go han-mhaith, mar sin úsáideann siad réiteach caighdeánach - taisce. Chomh maith leis an mbunachar sonraí, stóráiltear pictiúr sonraí áirithe i stóráil optamaithe le haghaidh oibríochtaí áirithe - memcacheddearg.

De ghnáth ní bhíonn an loighic taisceála chomh casta sin, ach níl sé an-cheart á cur i bhfeidhm in EloquentPostQueries (más rud é amháin Prionsabal Freagrachta Aonair). Tá sé i bhfad níos nádúrtha teimpléad a úsáid Maisitheoir agus cuir taisceadh i bhfeidhm mar mhaisiúchán don phríomhghníomh:

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

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

Déan neamhaird den chomhéadan Stór sa chruthaitheoir. Ar chúis éigin anaithnid, chinn siad an comhéadan le haghaidh taisceadh i Laravel a ainmniú ar an mbealach seo.

Rang i dtaiscePostQueries cuireann taisceadh amháin i bhfeidhm. $this->taisce->cuimhnigh seiceálann sé an bhfuil an iontráil seo sa taisce agus mura bhfuil, cuireann sé glaoch ar ais agus scríobhann sé an luach ar ais chuig an taisce. Níl fágtha ach an rang seo a chur i bhfeidhm san fheidhmchlár. Ní mór dúinn gach rang go bhfuil san iarratas a iarraidh ar chur i bhfeidhm an comhéadan Iarcheisteanna thosaigh sé ag fáil sampla den rang i dtaiscePostQueries. Mar sin féin, sé féin i dtaiscePostQueries caithfidh an cruthaitheoir rang a fháil mar pharaiméadar EloquentPostQueriesós rud é nach féidir é a oibriú gan "fíor" chur i bhfeidhm. Athraíonn muid 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);
    }
}

Tá cur síos nádúrtha ar mo mhianta go léir sa soláthraí. Mar sin, chuireamar caching i bhfeidhm dár n-iarratais trí rang amháin a scríobh agus cumraíocht an choimeádáin a athrú. Níl aon athrú ar an gcuid eile den chód iarratais.

Ar ndóigh, chun caching a chur i bhfeidhm go hiomlán, is gá freisin neamhbhailiú a chur i bhfeidhm ionas nach mbeidh an t-alt scriosta ag crochadh ar an suíomh ar feadh tamaill, ach go scriostar é láithreach. Ach is mionrudaí iad seo.

Bunlíne: ní úsáideamar ceann amháin, ach dhá theimpléad. Sampla Scaradh Freagrachta Iarratas Ordú (CQRS) molann sé oibríochtaí léamh agus scríobh a scaradh go hiomlán ag leibhéal an chomhéadain. Tháinig mé chuige tríd Prionsabal Deighilte Comhéadain, a thugann le tuiscint go ndéanaim patrúin agus prionsabail a ionramháil go sciliúil agus go ndíorthaíonn mé ceann ón gceann eile mar theoirim :) Ar ndóigh, ní bhíonn a leithéid de astarraingt ag teastáil ó gach tionscadal chun aonáin a roghnú, ach roinnfidh mé an cleas leat Ag céim tosaigh an iarratais forbairt, is féidir leat a chruthú go simplí rang Iarcheisteanna leis an ngnáthchur i bhfeidhm trí Eloquent:

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

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

Nuair a bhíonn gá le taisceadh, le bogadh simplí is féidir leat comhéadan (nó rang teibí) a chruthú in ionad an aicme seo Iarcheisteanna, a chur i bhfeidhm a chóipeáil chuig an rang EloquentPostQueries agus téigh go dtí an scéim ar chuir mé síos air níos luaithe. Ní gá an chuid eile den chód iarratais a athrú.

Na cleasa seo go léir le ranganna, comhéadain, Instealladh Spleáchais и CQRS cur síos mionsonraithe orthu i mo leabhar “Ailtireacht na bhFeidhmchláir Ghréasáin Choimpléascacha”. Tá réiteach ar an tomhas freisin cén fáth go bhfuil mo chuid ranganna go léir sna samplaí don alt seo marcáilte mar chríochnaitheach.

Foinse: will.com

Add a comment