ΠΠΈΠ½Π°Π»Π°ΡΠ° ΡΠ΅Π΄ΠΌΠΈΡΠ° Π½Π°ΠΏΠΈΡΠ°Ρ , Π½ΠΎ ΠΎΠ±Π΅ΡΠ°Ρ Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ ΠΏΠΎΠ»Π·Π°. ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌ ΠΊΠ°ΠΊ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠΎΠ·ΠΈ ΡΠ°Π±Π»ΠΎΠ½ Π² ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅. ΠΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ:
<?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
