ПолСзни Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° с Eloquent?

ΠœΠΈΠ½Π°Π»Π°Ρ‚Π° сСдмица писах статия Π·Π° бСзполСзността Π½Π° шаблона Repository Π·Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π½Π° 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, Π½ΠΎ ΠΏΡ€Π΅Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° класовСтС ΠΎΠ±Π΅ΠΊΡ‚ΠΈ с отговорността Π΄Π° сС ΠΈΠ·Π²Π»ΠΈΡ‡Π°Ρ‚ сами Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° идСя ΠΈ прСмСстванСто Π½Π° Ρ‚Π°Π·ΠΈ отговорност към класовС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. Π’Π°ΠΊΠ° Π΅? Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»Π½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ… Ρ‚ΠΎΠ·ΠΈ интСрфСйс Π½Π° Π΄Π²Π΅ части. ΠŸΡŠΡ€Π²Π°Ρ‚Π° част ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΡ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° запис.

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

  • ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½ΠΎΠ² ΠΎΠ±Π΅ΠΊΡ‚ ΠΈ прСдизвикатСлство PostRepository::save
  • PostRepository::getById, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° ΡΡŠΡ‰Π½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΡ€ΠΈΠ·ΠΎΠ²Π°Π²Π°Π½Π΅ PostRepository::save
  • прСдизвикатСлство PostRepository::delete

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

Частта Read ΠΌΠΈ сС струва Π½Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π±Π΅Π·ΠΏΠΎΠ»Π΅Π·Π½Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΡ€ΠΈ Π·Π° Eloquent ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° няколко Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΡƒΠΊ. Как Π΄Π° ΠΊΡ€ΡŠΡΡ‚ΠΈΠΌ класа? Мога ReadPostRepository, Π½ΠΎ към шаблона Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Ρ‚ΠΎΠΉ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° ΠΌΠ°Π»ΠΊΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ просто ΠŸΠΎΡΡ‚Π·Π°ΡΠ²ΠΊΠΈ:

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

ΠŸΡ€ΠΈΠ»Π°Π³Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ с 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();
    }
}

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

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

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

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

ΠΌΠ΅Ρ‚ΠΎΠ΄ PostsController::lastPosts просто моля Π·Π° някакво внСдряванС Заявки Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π½Π΅Π³ΠΎ. Π’ доставчика, ΠΊΠΎΠΉΡ‚ΠΎ ΡΠ²ΡŠΡ€Π·Π°Ρ…ΠΌΠ΅ ΠŸΠΎΡΡ‚Π·Π°ΡΠ²ΠΊΠΈ с класа EloquentPostQueries ΠΈ Ρ‚ΠΎΠ·ΠΈ клас Ρ‰Π΅ бъдС Π·Π°ΠΌΠ΅Π½Π΅Π½ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π°.

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

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

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

    // Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ практичСски Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅
}

Π˜Π³Π½ΠΎΡ€ΠΈΡ€Π°ΠΉΡ‚Π΅ интСрфСйса Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π² конструктора. По някаква нСизвСстна ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚Π΅ Ρ€Π΅ΡˆΠΈΡ…Π° Π΄Π° ΠΊΡ€ΡŠΡΡ‚ΡΡ‚ интСрфСйса Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅ Π² Laravel ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½.

Клас ΠšΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ запитвания Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ»Π°Π³Π° само ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅. $this->cache->remember провСрява Π΄Π°Π»ΠΈ Ρ‚ΠΎΠ·ΠΈ запис Π΅ Π² кСша ΠΈ Π°ΠΊΠΎ Π½Π΅, ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ ΠΈ записва Π²ΡŠΡ€Π½Π°Ρ‚Π°Ρ‚Π° стойност Π² кСша. Всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ остава, Π΅ Π΄Π° Π²Π½Π΅Π΄Ρ€ΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ клас Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. ИмамС Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ всички класовС Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π·Π° Π΄Π° поискамС имплСмСнтация Π½Π° интСрфСйса ΠŸΠΎΡΡ‚Π·Π°ΡΠ²ΠΊΠΈ Π·Π°ΠΏΠΎΡ‡Π½Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° СкзСмпляр Π½Π° класа ΠšΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ запитвания Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Бамият Ρ‚ΠΎΠΉ ΠΎΠ±Π°Ρ‡Π΅ ΠšΠ΅ΡˆΠΈΡ€Π°Π½ΠΈ запитвания Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ΡŠΡ‚ трябва Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ клас ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ EloquentPostQueriesΡ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π±Π΅Π· "истинска" рСализация. НиС сС промСнямС 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);
    }
}

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

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

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

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

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

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

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

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€