ααΆαααΈαααααΆα ααα»ααααα»αααΆαααααα
<?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);
}
αα·ααΈααΆαααααααΆαααααα’αΆα ααααΌαααΆαα’αα»ααααααΆαααααα·ααΆαααΆααααα·ααααα·ααΆα ααα»ααααααΆααααα»αααΎαααααααααααΆααα’αααααΆααααααΆααααα½ααα»αααααΌααααα»αααΆααα αααααα½αα―ααα·ααααααΆαααα·αααααα’αααα»αααααα α αΎαααΆααααααααΆαααα½ααα»αααααΌαααααα ααααΆααααααΆααα αΆααααΌα ααΆααα ααα»ααα α’ααα αΉααα? ααΆαα·ααααααα»ααααα ααα ααα»α αααααΆααααααααααΎαααΎαααΆααΈααααααα αααααααααΌααααα·ααΈααΆαααααααΉαααααΌαααΆαααααΎαααα»αααααα·ααααα·ααΆααααααα
ααααΎαααΆαααααααααααααΆαααΊα
- ααΆαααΆααααααααα»ααααΈ αα·ααααα αΆααααα PostRepository::save
- PostRepository::getById, ααΆααααα αα’αααααΆα αα·αααΆααααα α PostRepository::save
- αααα αΆααααα PostRepository::delete
ααααα·ααααα·ααΆαααααααα·αααααΎαα·ααΈααΆαααααααΆαααααα αααα»αβααααα·ααααα·ααΆαβα’αΆα ααααΎβααβαα·ααΈααΆααααα get* ααα»αααααα ααααα·αααΎα’αααα’αΆαα’αααΈ αααααΆααααααα ααα ααα»α αααααΆαα (αα·αα·α I Π² ααΉα) αααααΆαααα ααΆααΉαααΆααααα αααΆααααΆ α ααα»α αααααΆααααααααΎαααααα α αΎαα’αα»ααααααΆαααα½ααα»αααααΌααα»αααααΆαααΆααα·α ααΈαα ααΆαααααααααααααΌααααα ααααΆαααααΈαα αα·ααΈααΆααααα getById ααΆα αΆαααΆα ααααααΆααααΆααααΈα ααα»αααααα αααααααααααα·ααΈααΆαααααααα»αααααΆα ααΆαα’αα»ααααααααααΆααΉααα»αααααΆα ααΎαβααΉαβααΎαβααΆβααααα·α βαααααβααα αααα»αααΆααααααα’αααΈααΆαααααΆααααααααααααααααααααααα αααα»αα’ααααααα»α ααΌα αααααααα»αα’αααααααα αααα»αααΉαααααααα ααΆα ααα
ααααα Read α αΆααααΌα ααΆαααα»ααα·αααΌαααΆααααααααααα αααααααΌααααΈαααααααΆαα Eloquent ααα’αΆα ααΆαααΆαα’αα»ααααααΆα αααΎααα ααΈααααααα ααΎααααΌαααΆαααααααααααΆααα’αααΈ? α’αΆα ReadPostRepositoryααα»ααααα ααααααααΌ ααααΆαα ααΆααααΆαααΆαααΆααααααααα·α αα½α αα½α αα α αΎαα α’αααα’αΆα ααααΆαααα PostQueries:
<?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();
}
}
α ααα»α αααααΆααααααΌαααααααΆααααΆαα½αααΆαα’αα»ααααα§ααΆα ααααααα»α α’ααααααααααααΆαααααα·ααΈ:
<?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(),
]);
}
}
αα·ααΈααΆααααα PostController::lastPosts ααααΆαααααα»αα±ααα’αα»αααααααα PostQueries αα·αααααΎααΆαααΆαα½αααΆα αα αααα»αα’ααααααααααααΆαααααΎαααααΆαα PostQueries ααΆαα½αααααΆαα EloquentPostQueries α αΎαααααΆαααααααΉαααααΌαααΆααααα½ααα αααα»αα§ααααααααααΆα
ααΌααααααααΆαααααα·ααΈααααααΎαααΆαααααΆαααΆααΆαααααα·αααααΆαααααΆααα α’αααααααΎααααΆααααΆααααΆααααΆαααααα»ααα½αααΆααΈααΎααααααααΆαα½αααΉαααΆαααααα»αααα α»αααααααααα»αα ααΆαααααα»ααααααααααα·αααααα»αααααααΌαααΆαα’αΆαααΆααΉαααΆαααααααα ααΌαααααΆααα·αααααααα·ααααααααααααααα»αααααααααΆαααα’αα ααΌα αααααα½αααααααΎαααααααααΆααααααααΆα - ααααΆαααααααΆααα ααααααααΈααΎααΌαααααΆααα·αααααα ααΌααααα·ααααααααΆααααΆαααα½αααααΌαααΆααααααΆαα»ααααα»αααΆααααα»ααααααΆαααααΎα±αααααααΎααααααΆααααααα·ααααα·ααΆαααΆααααΆαα - memcached α¬ redis.
αααααα·ααααΆααααΆαααααααΆααααΆααααααΆαα·ααααα»αααααΆαααααα ααα»ααααααΆαα’αα»ααααααΆαα αααα»α 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 ααΆααα·ααΈαααα
ΠΠ»Π°ΡΡ CachedPostQueries α’αα»ααααααααααΆαααααααΆααααα»αααααα $this->cache-> α αα αΆα αα·αα·αααααΎαααΆααΎααΆαα»ααααααα·ααα αααα»αααααΆαααααααΆααα¬α’αα αααα α ααΌαααααααα ααΆαα α αααα‘αααααα·α α αΎααααααααααααααααΆααααα‘αααα ααΆααααααΆαααααααΆααα α’αααΈααααα αααααΊααααΌαα’αα»ααααααααΆααααααα αααα»ααααααα·ααΈα ααΎαααααΌαααΆαααααΆααααΆααα’ααααααα αααα»ααααααα·ααΈααΎααααΈααααΎαα»αααΆαα’αα»ααααα ααα»α αααααΆαα PostQueries α αΆααααααΎαααα½αααΆαα§ααΆα αααααααααΆαα CachedPostQueries. ααααααΆαααΆαααααααΆααααααΆαα CachedPostQueries α’αααααΆααααααααΌαααααα½αααΆαααααΆααααΆαααΆαααΆαααααα EloquentPostQueriesα αΆααααΆααααΈααΆαα·αα’αΆα ααααΎαααΆααααααααΆαααΆαα’αα»αααα "αα·αααααΆαα" α ααΎαααααΆααααααΌα α’ααααααααααααΆαααααα·ααΈ:
<?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) ααααΎα±ααααααΎααααα·ααααα·ααΆαα’αΆα αα·ααααααααΆα ααααα‘ααααΆαααααα»ααα ααααα·αα ααα»α αααααΆααα αααα»αααΆαααααααΆααααΆαααα αααααΆααααααα ααα ααα»α αααααΆααααααααα αΆαααΆαααα»ααααα αααααΆα αα·ααααααΆααααααΆαααα·ααααααα α αΎαααΆαααααΈαα½ααααααΆααααΉααααΈαα :) ααΆααΆααα·αααΆαα αα·αααααααααααααααααΆααα’ααααααΌαααΆαα’ααΌααΈαααααααααααΆααααΆαααααΎαααΎαα’αααααΆαααααα ααα»αααααααα»αααΉαα ααααααααααα·α ααΆαα½αα’ααααα ααααΆααααΆαααααΌαααααΆαα’αα»ααααα ααΆαα’αα·αααααα α’αααααααΆααααα’αΆα αααααΎαααααΆααααΆαα PostQueries ααΆαα½αααΉαααΆαα’αα»ααααααααααΆααΆαααα Eloquent:
<?php
final class PostQueries
{
public function getById($id): Post
{
return Post::findOrFail($id);
}
// Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
}
αα αααααααααααΌαααΆααααααΆααααααΆαααααααΆααααΎαα‘αΎα ααΆαα½αααΉαααΆαααααΆααααΈααααΆαααααα½α α’αααα’αΆα αααααΎαα ααα»α αααααΆαα (α¬ααααΆααα’ααΌααΈ) αααα½αααααΆααααα PostQueriesα ααααααΆαα’αα»ααααααααααΆαα ααααΆαα EloquentPostQueries α αΎαα αΌααα ααΆαααααααααΆαααααααααα»αααΆααα·αααααΆααΈαα»αα αααααΌααααααα·ααΈααααα ααααα·αα αΆαααΆα αααααΆααααααΌαααα
αααα·α
ααΆααα’αααααααΆαα½αααΉαααααΆαα, α
ααα»α
αααααΆαα, ααΆαα
αΆαααααα
αΌαααΆαα’αΆααααα ΠΈ CQRS ααΆααα·αααααΆαααα’α·ααα
αααα»α
ααααα: www.habr.com