ΠΠΈΠ½Π°Π»Π°ΡΠ° ΡΠ΅Π΄ΠΌΠΈΡΠ° ΠΏΠΈΡΠ°Ρ
<?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