ПолСзни Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ с Eloquent?

ΠœΠΈΠ½Π°Π»Π°Ρ‚Π° сСдмица написах статия Π·Π° бСзполСзността Π½Π° шаблона Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π·Π° Eloquent ΡΡŠΡ‰Π½ΠΎΡΡ‚ΠΈ, Π½ΠΎ ΠΎΠ±Π΅Ρ‰Π°Ρ… Π΄Π° Ρ€Π°Π·ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ частично Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° с ΠΏΠΎΠ»Π·Π°. Π—Π° Ρ‚ΠΎΠ²Π° Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌ ΠΊΠ°ΠΊ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Ρ‚ΠΎΠ·ΠΈ шаблон Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ‚Π΅. Минимално нСобходимият Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ:

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

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π² Ρ€Π΅Π°Π»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, Π°ΠΊΠΎ Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π² тях чСсто сС добавят ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° записи:

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

Π’Π΅Π·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π±ΠΈΡ…Π° ΠΌΠΎΠ³Π»ΠΈ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Ρ‡Ρ€Π΅Π· Eloquent scopes, Π½ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° класовСтС ΡΡŠΡ‰Π½ΠΎΡΡ‚ΠΈ с отговорности Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅Ρ‚ΠΎ Π½Π° самитС сСбС си Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° идСя ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ отговорност Π² класовСтС Π½Π° рСпозиторията ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. Π’Π°ΠΊΠ° Π»ΠΈ Π΅? Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»Π½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ… Ρ‚ΠΎΠ·ΠΈ интСрфСйс Π½Π° Π΄Π²Π΅ части. ΠŸΡŠΡ€Π²Π°Ρ‚Π° част ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Ρ‰Π΅ бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° запис.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Π°Ρ‚Π° опСрация Π·Π° запис Π΅:

  • конструиранС Π½Π° Π½ΠΎΠ² ΠΎΠ±Π΅ΠΊΡ‚ ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° PostRepository::save
  • PostRepository::getById, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈ със ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° PostRepository::save
  • ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ PostRepository::delete

Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° запис няма ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΠΈΠ·Π±ΠΎΡ€. Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΠ±Π°Ρ‡Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ само ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ get*. Ако сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ с Interface Segregation Principle (Π±ΡƒΠΊΠ²Π° I Π² SOLID), Ρ‰Π΅ станС ясно, Ρ‡Π΅ Π½Π°ΡˆΠΈΡΡ‚ интСрфСйс сС ΠΎΠΊΠ°Π·Π° Ρ‚Π²ΡŠΡ€Π΄Π΅ голям ΠΈ изпълнява ΠΏΠΎΠ½Π΅ Π΄Π²Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ отговорности. Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ Π½Π° Π΄Π²Π΅. ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ getById Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π΄Π²Π΅Ρ‚Π΅, Π½ΠΎ ΠΏΡ€ΠΈ услоТняванС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ. Π’ΠΎΠ²Π° Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-късно. Π—Π° бСзполСзността Π½Π° частта Π·Π° запис писах Π² ΠΌΠΈΠ½Π°Π»Π°Ρ‚Π° статия, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π² Ρ‚Π°Π·ΠΈ просто Ρ‰Π΅ забравя Π·Π° нСя.

Частта Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΠ±Π°Ρ‡Π΅ ΠΌΠΈ сС струва Π½Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π±Π΅Π·ΠΏΠΎΠ»Π΅Π·Π½Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΡ€ΠΈ Π·Π° Eloquent Ρ‚ΡƒΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° няколко Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Как Π΄Π° Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ класа? МоТС Π΄Π° сС Π½Π°Ρ€Π΅Ρ‡Π΅ ReadPostRepository, Π½ΠΎ към шаблона Repository Ρ‚ΠΎΠΉ Π²Π΅Ρ‡Π΅ няма ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅. МоТС просто Π΄Π° бъдС PostQueries:

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

НСговата рСализация с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Eloquent Π΅ доста проста:

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

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡŠΡ‚ трябва Π΄Π° бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ с рСализация, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² AppServiceProvider:

app->bind(PostQueries::class,
            EloquentPostQueries::class);
    }
}

Π’ΠΎΠ·ΠΈ клас Π²Π΅Ρ‡Π΅ Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½. Π’ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° своята отговорност, освобоТдавайки ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ΠΈΡ‚Π΅, ΠΈΠ»ΠΈ класа Π½Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎΡ‚ΠΎ. Π’ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π° Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Ρ‚Π°ΠΊΠ°:

$postQueries->getLastPosts(),
        ]);
    }
} 

ΠœΠ΅Ρ‚ΠΎΠ΄ PostsController::lastPosts просто иска някаква рСализация Π·Π° сСбС си PostsQueries ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ с нСя. Π’ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° Π½ΠΈΠ΅ ΡΠ²ΡŠΡ€Π·Π°Ρ…ΠΌΠ΅ PostQueries с класа EloquentPostQueries ΠΈ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π° Ρ‰Π΅ бъдС подставСн Ρ‚ΠΎΠ·ΠΈ клас.

НСка си прСдставим, Ρ‡Π΅ Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ стана ΠΌΠ½ΠΎΠ³ΠΎ популярно. Π₯иляди ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ Π² ΠΌΠΈΠ½ΡƒΡ‚Π° отварят страницата с послСднитС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Най-популярнитС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΡΡŠΡ‰ΠΎ сС Ρ‡Π΅Ρ‚Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ чСсто. Π‘Π°Π·ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π΅ сС справят Π΄ΠΎΠ±Ρ€Π΅ с Ρ‚Π°ΠΊΠΈΠ²Π° натоварвания, Π·Π°Ρ‚ΠΎΠ²Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° стандартното Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ β€” кСш. ОсвСн Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, някакъв ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΡŠΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΎ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ β€” memcached ΠΈΠ»ΠΈ redis.

Π›ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° слоТна, Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΉ Π² EloquentPostQueries Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ (ΠΏΠΎΠ½Π΅ ΠΏΠΎΡ€Π°Π΄ΠΈ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° СдинствСната отговорност). Много ΠΏΠΎ-СстСствСно Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡˆΠ°Π±Π»ΠΎΠ½ΡŠΡ‚ Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΊΠ°Ρ‚ΠΎ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° основното дСйствиС:

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

    // Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ практичСски са ΡΡŠΡ‰ΠΈΡ‚Π΅
}

НС ΠΎΠ±Ρ€ΡŠΡ‰Π°ΠΉΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° интСрфСйса Repository Π² конструктора. По нСпонятна ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚Π°ΠΊΠ° Ρ€Π΅ΡˆΠΈΡ…Π° Π΄Π° Π½Π°Ρ€Π΅ΠΊΠ°Ρ‚ интСрфСйса Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅ Π² Laravel.

Клас CachedPostQueries Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° само ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅. $this->cache->remember провСрява Π΄Π°Π»ΠΈ Ρ‚Π°Π·ΠΈ запись Π½Π΅ Π΅ Π² кСша ΠΈ Π°ΠΊΠΎ Π½Π΅ Π΅, ΠΈΠ·Π²ΠΈΠΊΠ²Π° callback ΠΈ записва Π² кСша Π²ΡŠΡ€Π½Π°Ρ‚Π°Ρ‚Π° стойност. ΠžΡΡ‚Π°Π²Π° само Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ клас Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. НуТно Π΅ всички класовС, ΠΊΠΎΠΈΡ‚ΠΎ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ искат рСализация Π½Π° интСрфСйса PostQueries Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ СкзСмпляр Π½Π° класа CachedPostQueries. ΠžΠ±Π°Ρ‡Π΅ самият CachedPostQueries ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π² конструктора трябва Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ класа EloquentPostQueries, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π±Π΅Π· "истинска" рСализация. ΠŸΡ€ΠΎΠΌΠ΅Π½ΡΠΌΠ΅ AppServiceProvider:

app->bind(PostQueries::class, 
            CachedPostQueries::class);

        $this->app->when(CachedPostQueries::class)
            ->needs(PostQueries::class)
            ->give(EloquentPostQueries::class);
    }
}

Всички ΠΌΠΎΠΈ ТСлания доста СстСствСно сС описват Π² ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°. Π’Π°ΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ…ΠΌΠ΅ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅ Π·Π° Π½Π°ΡˆΠΈΡ‚Π΅ заявки само ΠΊΠ°Ρ‚ΠΎ написахмС Π΅Π΄ΠΈΠ½ клас ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ…ΠΌΠ΅ конфигурацията Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. ΠšΠΎΠ΄ΡŠΡ‚ Π½Π° останалата част ΠΎΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ сС Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ».

Π Π°Π·Π±ΠΈΡ€Π° сС, Π·Π° ΠΏΡŠΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° ΠΈ инвалидация, Π·Π° Π΄Π° Π½Π΅ остава ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚Π°Ρ‚Π° статия Π½Π° сайта ΠΎΡ‰Π΅ извСстно Π²Ρ€Π΅ΠΌΠ΅, Π° Π΄Π° бъдС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚Π° Π²Π΅Π΄Π½Π°Π³Π°. Но Ρ‚ΠΎΠ²Π° Π²Π΅Ρ‡Π΅ са Π΄Ρ€Π΅Π±ΠΎΠ»ΠΈΠΈ.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚: ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ Π½Π΅ Π΅Π΄ΠΈΠ½, Π° Ρ†Π΅Π»ΠΈ Π΄Π²Π° шаблона. Π¨Π°Π±Π»ΠΎΠ½ΡŠΡ‚ Command Query Responsibility Segregation (CQRS) ΠΏΡ€Π΅Π΄Π»Π°Π³Π° напълно Π΄Π° сС раздСлят ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ запис Π½Π° Π½ΠΈΠ²ΠΎ интСрфСйси. Достигнах Π΄ΠΎ Π½Π΅Π³ΠΎ Ρ‡Ρ€Π΅Π· Interface Segregation Principle, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ умСя Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°ΠΌ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΡ‚Π΅ ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΠΌ Π΅Π΄Π½ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ΠΎΡ€Π΅ΠΌΠ° πŸ™‚ Π Π°Π·Π±ΠΈΡ€Π° сС, Π½Π΅ Π½Π° всСки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Ρ‚Π°ΠΊΠ°Π²Π° абстракция Π·Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° ΡΡŠΡ‰Π½ΠΎΡΡ‚ΠΈ, Π½ΠΎ Ρ‰Π΅ сподСля с вас Ρ‚Ρ€ΠΈΠΊ. На началния Π΅Ρ‚Π°ΠΏ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ просто Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ клас PostQueries с ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½Π° рСализация Ρ‡Ρ€Π΅Π· Eloquent:

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

    // Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ
}

ΠšΠΎΠ³Π°Ρ‚ΠΎ възникнС нСобходимост ΠΎΡ‚ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅, с Π»Π΅ΠΊΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ интСрфСйс (ΠΈΠ»ΠΈ абстрактСн клас) Π½Π° мястото Π½Π° Ρ‚ΠΎΠ·ΠΈ клас PostQueries, Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° рСализация Π² класа EloquentPostQueries ΠΈ Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅Ρ‚Π΅ към схСмата, описана ΠΎΡ‚ ΠΌΠ΅Π½ ΠΏΠΎ-Ρ€Π°Π½ΠΎ. ΠžΡΡ‚Π°Π½Π°Π»ΠΈΡΡ‚ ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС промСня.

Всички Ρ‚Π΅Π·ΠΈ Ρ‚Ρ€ΠΈΠΊΠΎΠ²Π΅ с класовСтС, интСрфСйситС, Dependency Injection ΠΈ CQRS са ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описани Π² моят Ρ‚Ρ€ΡƒΠ΄ β€žΠΡ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π½Π° слоТни ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡβ€œ. Π’Π°ΠΌ Π΅ Ρ€Π°Π·Π³Π°Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π·Π°Π³Π°Π΄ΠΊΠ°Ρ‚Π° Π·Π°Ρ‰ΠΎ всички ΠΌΠΎΠΈ класовС Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ статия са ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ ΠΊΠ°Ρ‚ΠΎ Ρ„ΠΈΠ½Π°Π»Π½ΠΈ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster