Stòran feumail le Eloquent?

An t-seachdain sa chaidh sgrìobh mi artaigil mu cho feumail sa tha an teamplaid Repository airson buidhnean Eloquent, ge-tà, gheall e innse dhomh mar a chleachdas mi pàirt dheth airson a bhuannachd. Gus seo a dhèanamh, feuchaidh mi ri sgrùdadh a dhèanamh air mar a bhios an teamplaid seo air a chleachdadh mar as trice ann am pròiseactan. An seata as lugha de dhòighean a tha a dhìth airson stòr:

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

Ach, ann am pròiseactan fìor, ma chaidh co-dhùnadh stòran-tasgaidh a chleachdadh, bidh dòighean airson clàran fhaighinn air ais gu tric air an cur riutha:

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

Dh’ fhaodadh na dòighean sin a bhith air an cur an gnìomh tro scopes Eloquent, ach chan e cus de chlasaichean eintiteas leis an uallach a bhith gam faighinn fhèin am beachd as fheàrr, agus tha e loidsigeach an uallach seo a ghluasad gu clasaichean tasgaidh. A bheil e mar sin? Roinn mi gu sònraichte an eadar-aghaidh seo gu dà phàirt. Thèid a’ chiad phàirt de na dòighean a chleachdadh ann an obair sgrìobhaidh.

Is e an obair sgrìobhaidh àbhaisteach:

  • togail nì agus dùbhlan ùr PostRepository ::sàbhail
  • Stòr-tasgaidh::getById, làimhseachadh agus gairm eintiteas PostRepository ::sàbhail
  • dùbhlan Stòr-dàta :: sguab às

Cha bhith gnìomhan sgrìobhaidh a’ cleachdadh dhòighean lorg. Ann an obraichean leughaidh, chan eil ach dòighean faigh * air an cleachdadh. Ma leughas tu mu dheidhinn Prionnsabal dealachaidh eadar-aghaidh (litir I в solid), an uairsin bidh e soilleir gu bheil an eadar-aghaidh againn ro mhòr agus a’ coileanadh co-dhiù dà dhleastanas eadar-dhealaichte. Tha an t-àm ann a roinn le dhà. Dòigh-obrach faighId riatanach anns an dà chuid, ach mar a bhios an tagradh a’ fàs nas iom-fhillte, bidh na gnìomhan aige eadar-dhealaichte. Chì sinn seo beagan nas fhaide air adhart. Sgrìobh mi mu cho feumail sa tha am pàirt sgrìobhaidh ann an artaigil roimhe, agus mar sin anns an fhear seo bidh mi dìreach a’ dìochuimhneachadh mu dheidhinn.

Tha e coltach riumsa nach eil am pàirt Read cho gun fheum, oir eadhon airson Eloquent dh’ fhaodadh grunn bhuileachadh a bhith an seo. Dè an t-ainm a th’ air a’ chlas? Faodaidh LeughPostRepository, ach ris an teampull Stòrlann chan eil mòran buntainneachd aige mu thràth. Faodaidh tu dìreach Ceistean post:

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

Tha e gu math sìmplidh a chuir an gnìomh 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();
    }
}

Feumaidh an eadar-aghaidh a bhith co-cheangailte ris a’ bhuileachadh, mar eisimpleir ann an Solaraiche AppService:

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

Tha an clas seo mar-thà feumail. Bidh e a’ tuigsinn a dhleastanas le bhith a’ faochadh an dàrna cuid an luchd-riaghlaidh no an clas eintiteas. Ann an rianadair faodar a chleachdadh mar seo:

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

Modh Rianadair puist ::lastPosts dìreach ag iarraidh beagan buileachaidh Ceistean puist agus ag obair leis. Anns an t-solaraiche rinn sinn ceangal Ceistean post le clas Ceistean-puist Eloquent agus thèid an clas seo a chuir a-steach don rianadair.

Smaoinich gu bheil an tagradh againn air fàs mòr-chòrdte. Bidh na mìltean de luchd-cleachdaidh gach mionaid a’ fosgladh na duilleige leis na foillseachaidhean as ùire. Bidh na foillseachaidhean as mòr-chòrdte cuideachd air an leughadh gu math tric. Cha bhith stòran-dàta a’ làimhseachadh luchdan mar sin gu math, agus mar sin bidh iad a’ cleachdadh fuasgladh àbhaisteach - tasgadan. A bharrachd air an stòr-dàta, tha dealbh dàta sònraichte air a stòradh ann an stòradh air a bharrrachadh airson cuid de ghnìomhachd - memcached no sgaoileadh.

Mar as trice chan eil loidsig tasgadan cho iom-fhillte, ach chan eil a bhith ga chuir an gnìomh ann an EloquentPostQueries gu math ceart (ma tha sin dìreach air sgàth Prionnsapal Uallach Singilte). Tha e tòrr nas nàdarra teamplaid a chleachdadh Sgeadaiche agus cuir an gnìomh caching mar sgeadachadh airson a’ phrìomh ghnì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();
            });
    }

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

Leig seachad an eadar-aghaidh Stòrlann anns an neach-togail. Airson adhbhar neo-aithnichte, chuir iad romhpa an eadar-aghaidh ainmeachadh airson tasgadh ann an Laravel san dòigh seo.

Clas Ceistean Post tasgadan a’ cur an gnìomh caching a-mhàin. $this->cache-> cuimhnich dèan cinnteach a bheil an inntrig seo san tasgadan agus mura h-eil, an uairsin cuir fios air ais agus a’ sgrìobhadh an luach a chaidh a thilleadh chun tasgadan. Chan eil air fhàgail ach an clas seo a chuir an sàs san tagradh. Feumaidh sinn a h-uile clas a tha san tagradh gus an eadar-aghaidh a chuir an gnìomh Ceistean post thòisich e air eisimpleir fhaighinn den chlas Ceistean Post tasgadan. Ge-tà, e fhèin Ceistean Post tasgadan feumaidh an neach-togail clas fhaighinn mar pharamadair Ceistean-puist Eloquentoir chan urrainn dha obrachadh às aonais buileachadh “fìor”. Bidh sinn ag atharrachadh Solaraiche AppService:

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

Tha a h-uile miann agam air a mhìneachadh gu nàdarrach anns an t-solaraiche. Mar sin, chuir sinn an gnìomh tasgadan airson na h-iarrtasan againn a-mhàin le bhith a’ sgrìobhadh aon chlas agus ag atharrachadh rèiteachadh an t-soithich. Chan eil an còrr de chòd an tagraidh air atharrachadh.

Gu dearbh, gus tasgadan a chuir an gnìomh gu h-iomlan, feumar dì-dhligheachadh a chuir an gnìomh gus nach bi an artaigil a chaidh a dhubhadh às a ’crochadh air an làrach airson ùine, ach gun tèid a dhubhadh às sa bhad. Ach is e rudan beaga a tha seo.

Fon loidhne: cha do chleachd sinn aon, ach dà theamplaid. Sampall Sgaradh Uallach Ceist Àithne (CQRS) a’ moladh gnìomhachd leughaidh is sgrìobhaidh a sgaradh gu tur aig ìre an eadar-aghaidh. Thàinig mi troimhe Prionnsabal dealachaidh eadar-aghaidh, a tha a’ nochdadh gu bheil mi gu sgileil a’ làimhseachadh phàtranan agus phrionnsabalan agus a’ faighinn fear bhon fhear eile mar theòirim :) Gu dearbh, chan fheum a h-uile pròiseact a leithid de tharraing airson a bhith a’ taghadh aonadan, ach roinnidh mi an cleas riut. leasachadh, faodaidh tu dìreach clas a chruthachadh Ceistean post leis a’ bhuileachadh àbhaisteach tro Eloquent:

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

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

Nuair a dh’ èiricheas an fheum air tasgadan, le gluasad sìmplidh faodaidh tu eadar-aghaidh (no clas eas-chruthach) a chruthachadh an àite a’ chlas seo Ceistean post, dèan lethbhreac den bhuileachadh aige don chlas Ceistean-puist Eloquent agus rachaibh chun sgeama a mhìnich mi na bu thràithe. Chan fheum an còrr den chòd tagraidh atharrachadh.

Na cleasan sin uile le clasaichean, eadar-aghaidh, Injection eisimeileachd и CQRS air a mhìneachadh gu mionaideach ann an an leabhar agam “Ailtireachd de thagraidhean lìn iom-fhillte”. Tha fuasgladh ann cuideachd air an tòimhseachan carson a tha na clasaichean agam uile anns na h-eisimpleirean airson an artaigil seo air an comharrachadh mar dheireannach.

Source: www.habr.com

Cuir beachd ann