Ebe nchekwa bara uru yana ndị Eloquent?

N'izu gara aga ka m dere edemede gbasara abaghị uru nke ndebiri nchekwa maka ụlọ ọrụ ndị na-ekwu okwu, Otú ọ dị, o kwere nkwa ịgwa m ka m ga-esi jiri akụkụ ụfọdụ mee ihe maka ọdịmma ya. Iji mee nke a, m ga-agbalị nyochaa otú e si eji template a eme ihe na ọrụ. Usoro kacha nta achọrọ maka ebe nchekwa:

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

Otú ọ dị, na ezigbo ọrụ, ọ bụrụ na ekpebie iji ebe nchekwa, a na-agbakwunyekarị usoro maka iweghachite ndekọ na ha:

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

Enwere ike itinye usoro ndị a site n'ụdị dị oke egwu, mana ịbufe klaasị na ibu ọrụ nke ịweta onwe ha abụghị echiche kachasị mma, na ibugharị ọrụ a na klaasị nchekwa dị ka ihe ezi uche dị na ya. Ọ dị otú ahụ? M kpọmkwem anya kewara a interface n'ime abụọ akụkụ. A ga-eji akụkụ mbụ nke ụzọ ndị a na-arụ ọrụ ederede.

Ọrụ ide ọkọlọtọ bụ:

  • iwu ihe ọhụrụ na ihe ịma aka PostRepository::chekwa
  • PostRepository::getById, njikwa ụlọ ọrụ na ịkpọ oku PostRepository::chekwa
  • ihe ịma aka PostRepository::Hichapụ

Arụmọrụ dee anaghị eji ụzọ weta. N'ịrụ ọrụ ọgụgụ, naanị ụzọ nweta* ka a na-eji. Ọ bụrụ na ị na-agụ banyere Ụkpụrụ nkewa nke Interface (akwụkwọ ozi I в AHID), mgbe ahụ, ọ ga-edo anya na interface anyị dị oke ibu ma na-arụ ọrụ ma ọ dịkarịa ala abụọ dị iche iche. Ọ bụ oge iji kewaa ya abụọ. Usoro nwetaById dị mkpa na abụọ ahụ, ma ka ngwa ahụ na-aghọwanye mgbagwoju anya, mmejuputa ya ga-adị iche. Anyị ga-ahụ nke a ntakịrị oge. Edere m banyere abaghị uru nke akụkụ ederede na edemede gara aga, yabụ na nke a, m ga-echefu ya.

The Read akụkụ yiri m na ọ bụghị otú na-abaghị uru, ebe ọ bụ na ọbụna maka Eloquent enwere ike inwe ọtụtụ mmejuputa ebe a. Kedu ihe ị ga-akpọ klas ahụ? Nwere ike Gụọ ebe nchekwa akwụkwọ, ma na template Ndozi o nweelarị ntakịrị mkpa. Ị nwere ike Ajuju post:

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

Ime ya na Eloquent dị nnọọ mfe:

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

A ghaghị jikọta interface ahụ na mmejuputa ya, dịka ọmụmaatụ na Onye na-eweta AppService:

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

Klas a abalarị uru. Ọ na-aghọta ọrụ ya site n'iwepụ ma ndị njikwa ma ọ bụ klaasị ụlọ ọrụ. Na njikwa, enwere ike iji ya dị ka ndị a:

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

.Zọ PostsController::Posts ikpeazụ dị nnọọ na-arịọ maka ụfọdụ mmejuputa iwu Ajuju Posts na-arụ ọrụ na ya. Na onye na-eweta anyị jikọtara Ajuju post ya na klas Ajụjụ nke ukwuuPost na klaasị a ga-anọchi n'ime njikwa.

Ka anyị were ya na ngwa anyị aghọwo ihe ewu ewu nke ukwuu. Ọtụtụ puku ndị ọrụ kwa nkeji na-eji akwụkwọ ọhụrụ emepe ibe ahụ. A na-agụkwa akwụkwọ ndị kacha ewu ewu. Ebe nchekwa data adịghị edozi ibu dị otú ahụ nke ọma, n'ihi ya, ha na-eji ngwọta ọkọlọtọ - cache. Na mgbakwunye na nchekwa data, a na-echekwa ụfọdụ foto data na nchekwa ahaziri maka ọrụ ụfọdụ - kpochapụrụ ma ọ bụ chọgharịa.

Ntughari mgbagha anaghị adịkarị mgbagwoju anya, mana itinye ya na EloquentPostQueries adịghị mma (ọ bụrụ naanị n'ihi na Respkpụrụ Nanị Ọrụ). Ọ bụ ihe okike karịa iji template Onye na-achọ mma ma mejuputa caching dị ka ihe ịchọ mma maka isi ihe:

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

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

Ileghara interface ahụ anya Ndozi na onye nrụpụta. N'ihi ihe ụfọdụ amaghị, ha kpebiri ịkpọ interface maka caching na Laravel otu a.

Класс CachedPostQueries na-arụ ọrụ caching naanị. $this->cache->cheta na-enyocha ma ntinye a ọ dị na cache ma ọ bụrụ na ọ bụghị, kpọọ oku azụ wee dee uru eweghachiri na cache. Naanị ihe fọdụrụ bụ itinye klas a n'ime ngwa. Anyị chọrọ klaasị niile dị na ngwa iji rịọ maka mmejuputa interface ahụ Ajuju post malitere ịnata ihe atụ nke klaasị CachedPostQueries. Otú ọ dị, ya onwe ya CachedPostQueries onye nrụpụta ga-anata klaasị dịka oke Ajụjụ nke ukwuuPostebe ọ bụ na ọ nweghị ike ịrụ ọrụ na-enweghị mmejuputa "ezigbo". Anyị na-agbanwe Onye na-eweta 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);
    }
}

A na-akọwapụta ọchịchọ m niile na onye na-eweta ya. Ya mere, anyị mebere caching maka arịrịọ anyị naanị site na ide otu klas na ịgbanwe nhazi akpa. Koodu ngwa ndị ọzọ agbanwebeghị.

N'ezie, iji mejuputa caching n'ụzọ zuru ezu, ọ dịkwa mkpa iji mejuputa mmebi iwu ka isiokwu ahụ ehichapụ ghara ihie na saịtị ahụ ruo oge ụfọdụ, ma ehichapụ ya ozugbo. Ma ihe ndị a bụ obere ihe.

N'okpuru: anyị na-eji ọ bụghị otu, ma abụọ ndebiri. Ihe atụ Nkewa Ọrụ Ajụjụ Iwu (CQRS) na-atụ aro ka ị kewaa ịgụ na ide ọrụ na ọkwa interface. Abịara m ya site na ya Ụkpụrụ nkewa nke Interface, nke na-atụ aro na m ji nkà na-emegharị ụkpụrụ na ụkpụrụ ma na-enweta otu site na nke ọzọ dị ka a theorem :) N'ezie, ọ bụghị ọ bụla oru ngo chọrọ ndị dị otú ahụ abstraction maka ịhọrọ ụlọ ọrụ, ma m ga-eso gị kerịta aghụghọ ahụ. mmepe, ị nwere ike ịmepụta klas naanị Ajuju post na mmejuputa a na-emebu site na Eloquent:

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

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

Mgbe mkpa maka caching bilitere, site na mmegharị dị mfe ị nwere ike ịmepụta interface (ma ọ bụ klaasị nkịtị) n'ọnọdụ klaasị a. Ajuju post, detuo mmejuputa ya na klaasị Ajụjụ nke ukwuuPost wee gaa na atụmatụ m kọwara na mbụ. Koodu ngwa ndị ọzọ adịghị mkpa ịgbanwe.

Aghụghọ ndị a niile nwere klaasị, interfaces, Ịdabere na Ọgwụ и CQRS na-kọwara n'ụzọ zuru ezu na akwụkwọ m "Architecture of Complex Web Applications". Enwekwara ihe ngwọta maka ilu ahụ ihe mere e ji were akara klas m niile na ihe atụ maka isiokwu a dị ka nke ikpeazụ.

isi: www.habr.com

Tinye a comment