แฌแแแ แแแแ แแก แแแแฌแแ แ
<?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:: แจแแแแฎแแ
- PostRepository::getById, แกแฃแแแแฅแขแแก แแแแแแฃแแแ แแแ แแ แแแแแซแแฎแแแ PostRepository:: แจแแแแฎแแ
- แแแแแฌแแแแ PostRepository:: แฌแแจแแ
แฉแแฌแแ แแก แแแแ แแชแแแแจแ แแ แแแแแแงแแแแแ แแแแแขแแแแก แแแแแแแแ. แฌแแแแแฎแแแก แแแแ แแชแแแแจแ แแแแแแงแแแแแ แแฎแแแแ get* แแแแแแแแ. แแฃ แฌแแแแแแฎแแแ แจแแกแแฎแแ แแแขแแ แคแแแกแแก แกแแแ แแแแชแแแก แแ แแแชแแแ (แฌแแ แแแ I ะฒ แฒแฒงแฒแฒ แฒ), แแแจแแ แแแแ แแแแแ, แ แแ แฉแแแแ แแแขแแ แคแแแกแ แซแแแแแ แแแแแ แแ แแกแ แฃแแแแก แแแแแแฃแ แแ แแแแกแฎแแแแแแฃแ แแแกแฃแฎแแกแแแแแแแแแก. แแ แแ แแแแงแแ แแ แแ. แแแแแแ getById แแฃแชแแแแแแแแ แแ แแแแจแ, แแแแ แแ แ แแช แฃแคแ แ แ แแฃแแ แฎแแแแ แแแแแแแชแแ, แแแกแ แแแแฎแแ แชแแแแแแ แแแแกแฎแแแแแแแ. แแแแก แชแแขแ แแแแแแแแแแแ แแแแฎแแแ. แฉแแฌแแ แแก แแแฌแแแแก แฃแกแแ แแแแแแแแก แจแแกแแฎแแ แแแแฌแแ แ แฌแแแ แกแขแแขแแแจแ, แแแแขแแ แแ แกแขแแขแแแจแ แฃแแ แแแแ แแแแแแแฌแงแแ แแแก.
แฌแแแแแฎแแแก แแแฌแแแ แแ แช แแฃ แแกแ แฃแกแแ แแแแแ แแแฉแแแแแแ, แ แแแแแ 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 แฃแแ แแแแ แแแฎแแแก แแแแฎแแ แชแแแแแแแก PostsQuery แแ แแฃแจแแแแก แแแกแแแ. แฉแแแ แแแแ แแแแแแจแแ แแแฃแ แแ แแแแแแแ แจแ แแแกแขแจแแแแแฎแแแแ แแแแกแแแ แแ แแแ 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-แจแ.
แแแแกแ CachedPostQueries แแฎแแ แชแแแแแแก แแฎแแแแ แฅแแจแแ แแแแก. $this->cache-> แแแแแฎแกแแแ แแแ แแแแฌแแแแก แแ แแก แแฃ แแ แ แแก แฉแแแแฌแแ แ แฅแแจแจแ แแ แแฃ แแ แ, แจแแแแแ แฃแ แแแแแก แแ แฌแแ แก แแแแ แฃแแแแฃแ แแแแจแแแแแแแแก แฅแแจแจแ. แ แฉแแแ แแฎแแแแ แแ แแแแกแแก แแแแแ แแแ แแแแแแแชแแแจแ. แฉแแแ แแแญแแ แแแแ แงแแแแ แแแแกแ, แ แแแแแแช แแแแแแแชแแแจแ แแแแแฎแแแแก แแแขแแ แคแแแกแแก แแแแฎแแ แชแแแแแแ แแแกแขแจแแแแแฎแแแแ แแแแฌแงแ แแแแกแแก แแแกแขแแแชแแแก แแแฆแแแ CachedPostQueries. แแฃแแชแ แแแแแแ CachedPostQueries แแแแกแขแ แฃแฅแขแแ แแ แแแ แแแแขแ แแ แฃแแแ แแแแฆแแก แแแแกแ 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);
}
}
แงแแแแ แฉแแแ แกแฃแ แแแแ แกแแแแแแ แแฃแแแแ แแแแ แแ แแก แแฆแฌแแ แแแ แแ แแแแแแแ แจแ. แแแ แแแแ, แฉแแแ แแแแแแฎแแ แชแแแแแ แฉแแแแ แแแแฎแแแแแแแก แฅแแจแแ แแแ แแฎแแแแ แแ แแ แแแแกแแก แแแฌแแ แแ แแ แแแแขแแแแแ แแก แแแแคแแแฃแ แแชแแแก แจแแชแแแแ. แแแแแ แฉแแแ แแแแแชแฎแแแแก แแแแ แแ แจแแชแแแแแ.
แ แ แแฅแแ แฃแแแ, แฅแแจแแ แแแแก แกแ แฃแแงแแคแแแแ แแแแกแแฎแแ แชแแแแแแแแ, แแกแแแ แแฃแชแแแแแแแแ แแแแแแแแแก แแแแฎแแ แชแแแแแแ, แ แแแ แฌแแจแแแแ แกแขแแขแแ แแแ แแแแฃแแ แแ แแแ แแ แแแแแแแก แกแแแขแแ, แแแแ แแ แแแฃแงแแแแแแแแ แฌแแแจแแแแก. แแแแ แแ แแก แฃแแแแจแแแแแ แ แแ แแ แแก.
แแแแแแแ แ: แฉแแแ แแแแแแแงแแแแ แแ แ แแ แแ, แแ แแแแ แแ แ แจแแแแแแ. แแแแฃแจแ Command Query Responsibility Segregation (CQRS) แแแแแแแแแแก แกแ แฃแแแ แแแแชแแแแแแแแก แฌแแแแแฎแแแกแ แแ แฉแแฌแแ แแก แแแแ แแชแแแแ แแแขแแ แคแแแกแแก แแแแแแ. แแ แแแกแแแ แแแแแแ แแแขแแ แคแแแกแแก แกแแแ แแแแชแแแก แแ แแแชแแแ, แ แแช แแแแคแแฅแ แแแแแแแก, แ แแ แแกแขแแขแฃแ แแ แแแแฃแจแแแแ แจแแแแแแแแก แแ แแ แแแชแแแแแก แแ แแ แแ แแแแ แแกแแแ แแแแ แแแแก แกแแฎแแ แแแแแแแงแแแ :) แ แ แแฅแแ แฃแแแ, แงแแแแ แแ แแแฅแขแก แแ แกแญแแ แแแแ แแกแแแ แแแกแขแ แแฅแชแแ แกแฃแแแแฅแขแแแแก แจแแ แฉแแแแกแแแแก, แแแแ แแ แแแแแแแแ แแแ แฎแ แแแก.แแแแแแแชแแแก แกแแฌแงแแก แแขแแแแ แแแแแแแแ แแแ, แจแแแแซแแแแ แฃแแ แแแแ แจแแฅแแแแ แแแแกแ แแแกแขแจแแแแแฎแแแแ แฉแแแฃแแแแ แแแ แแแแฎแแ แชแแแแแแแ Eloquent-แแก แกแแจแฃแแแแแแ:
<?php
final class PostQueries
{
public function getById($id): Post
{
return Post::findOrFail($id);
}
// ะดััะณะธะต ะผะตัะพะดั
}
แ แแแแกแแช แฉแแแแแ แฅแแจแแ แแแแก แกแแญแแ แแแแ, แแแ แขแแแ แแแแแฏแแ แจแแแแซแแแแ แจแแฅแแแแ แแแขแแ แคแแแกแ (แแ แแแกแขแ แแฅแขแฃแแ แแแแกแ) แแ แแแแกแแก แแแชแแแแ. แแแกแขแจแแแแแฎแแแแ, แแแแแแแแ แแ แแแกแ แแแแฎแแ แชแแแแแแ แแแแกแจแ EloquentPostQueries แแ แแแแแแแ แแแ แ แแฆแฌแแ แแ แกแฅแแแแแ. แแแแแ แฉแแแ แแแแแแแชแแแก แแแแ แแ แกแแญแแ แแแแก แจแแชแแแแก.
แงแแแแ แแก แฎแ แแแ แแแแกแแแแ, แแแขแแ แคแแแกแแแแ, แแแแแแแแแแฃแแแแแก แแแแฅแชแแ ะธ CQRS แแแขแแแฃแ แแ แแฆแฌแแ แแแแ
แฌแงแแ แ: www.habr.com