ืืฉืืืข ืฉืขืืจ ืืชืืชื
<?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::delete
ืคืขืืืืช ืืชืืื ืืื ื ืืฉืชืืฉืืช ืืฉืืืืช ืืืืืจ. ืืคืขืืืืช ืงืจืืื ืืฉืชืืฉืื ืจืง ืืฉืืืืช get*. ืื ืงืจืืช ืขื ืขืงืจืื ืืคืจืืช ืืืฉืง (ืึดืึฐืชึธื I ะฒ ืืืฆืง), ืื ืืชืืจืจ ืฉืืืืฉืง ืฉืื ื ืืืื ืืื ืืืืฆืข ืืคืืืช ืฉืชื ืชืืืื ืืืจืืืช ืฉืื ืื. ืืืืข ืืืื ืืืืง ืืืชื ืืฉื ืืื. ืฉืืื getById ืืื ืืืจืื ืืฉื ืืื, ืื ืืื ืฉืืืืฉืื ื ืขืฉื ืืืจืื ืืืชืจ, ืืืืืขืืช ืฉืื ืืืื ืฉืื ืืช. ื ืจืื ืืช ืื ืงืฆืช ืืืืืจ ืืืชืจ. ืืชืืชื ืขื ืืืกืจ ืืชืืขืืช ืฉื ืืืง ืืืชืืื ืืืืืจ ืงืืื, ืื ืืืืืจ ืืื ืื ื ืคืฉืื ืืฉืื ืืื.
ืืืืง ืฉื Read ื ืจืื ืื ืื ืื ืื ืืกืจ ืชืืขืืช, ืืืืืื ืฉืืคืืื ืขืืืจ Eloquent ืขืฉืืืื ืืืืืช ืืื ืืื ืืืฉืืืื. ืืื ืงืืจืืื ืืืืชื? ืคืืืช ReadPostRepository, ืืื ืืชืื ืืช Repository ืืฉ ืื ืืืจ ืืขื ืจืืืื ืืืืช. ืืชื ืืืื ืคืฉืื 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();
}
}
ืืืืฉืง ืืืื ืืืืืช ืืฉืืื ืืืืฉืื, ืืืฉื ื 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 ืจืง ืืืงืฉ ืืืฉืื ืืืฉืื PostsQueries ืืขืืื ืขื ืื. ืืกืคืง ืฉืงืืฉืจื ื PostQueries ืขื ืืืืชื EloquentPostQueries ืืืืืืงื ืืื ืชืืืืฃ ืืืงืจ.
ืืืื ื ืืืืื ืฉืืืคืืืงืฆืื ืฉืื ื ืืคืื ืคืืคืืืจืืช ืืืื. ืืืคื ืืฉืชืืฉืื ืืืงื ืคืืชืืื ืืช ืืืฃ ืขื ืืคืจืกืืืื ืืืืจืื ืื. ืื ืืคืจืกืืืื ืืคืืคืืืจืืื ืืืืชืจ ื ืงืจืืื ืืขืชืื ืงืจืืืืช ืืืื. ืืกืื ื ืชืื ืื ืื ืืืคืืื ืืขืืืกืื ืืืื ืืฆืืจื ืืืื, ืืืื ืื ืืฉืชืืฉืื ืืคืชืจืื ืกืื ืืจืื - ืืืืื. ืื ืืกืฃ ืืืกื ืื ืชืื ืื, ืชืืื ืช ืืฆื ืืกืืืืช ืืืืืกื ืช ืืืืกืื ืืืืชืื ืืคืขืืืืช ืืกืืืืืช - ื ืฉืื ืืืืฉื ืื ืืืืจ.
ืืืืืงื ืฉื ืืืืื ืืื ืืืจื ืืื ืื ืื ืื ืืกืืืืช, ืืื ืืืืขืชื ื- 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();
});
}
// ะดััะณะธะต ะผะตัะพะดั ะฟัะฐะบัะธัะตัะบะธ ัะฐะบะธะต ะถะต
}
ืืชืขืื ืืืืืฉืง Repository ืืงืื ืกืืจืืงืืืจ. ืืกืืื ืื ืืืืขื, ืื ืืืืืื ืืงืจืื ืืช ืืืืฉืง ืืืืกืื ืืืืืื ื-Laravel ืืฆืืจื ืื.
ืืืืชื CachedPostQueries ืืืืฉืืช ืืืืื ืืืื. $this->cache->ืืืืจ ืืืืง ืื ืืขืจื ืืื ื ืืฆื ืืืืืื ืืื ืื, ืื ืงืืจื ืืืชืงืฉืจืืช ืืืืจืช ืืืืชื ืืช ืืขืจื ืืืืืืจ ืืืืืื. ืื ืื ืฉื ืืชืจ ืืื ืืืืฉื ืืช ืืืืืงื ืืื ืืืคืืืงืฆืื. ืื ืื ื ืฆืจืืืื ืืช ืื ืืืืืงืืช ืืืคืืืงืฆืื ืืื ืืืงืฉ ืืืฉืื ืฉื ืืืืฉืง PostQueries ืืชืืืื ืืงืื ืืืคืข ืฉื ืืืืชื 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);
}
}
ืื ืืืฉืืืืช ืฉืื ืืชืืืจืืช ืืืืคื ืืืขื ืืกืคืง. ืืคืืื, ืืืืขื ื ืืืืื ืขืืืจ ืืืงืฉืืช ืฉืื ื ืจืง ืขื ืืื ืืชืืืช ืืืืงื ืืืช ืืฉืื ืื ืชืฆืืจืช ืืงืื ืืืื ืจ. ืฉืืจ ืงืื ืืืคืืืงืฆืื ืื ืืฉืชื ื.
ืืืืื, ืืื ืืืืฉื ืืื ืฉื ืืืืื, ืืฉ ืฆืืจื ืื ืืืืฉื ืืืืื ืชืืงืฃ ืืื ืฉืืืืืจ ืฉื ืืืง ืื ืืชืงืข ืืืชืจ ืืืฉื ืืื ืื, ืืื ืืืืืง ืืื. ืืื ืืื ืืืจืื ืืื ืืจืืื.
ืืฉืืจื ืืชืืชืื ื: ืื ืืฉืชืืฉื ื ืืืืช, ืืื ืืฉืชื ืชืื ืืืช. ืึดืืขืึนื ืืคืจืืช ืืืจืืืช ืฉืืืืชืช ืคืงืืื (CQRS) ืืฆืืข ืืืคืจืื ืืืืืืื ืืื ืคืขืืืืช ืงืจืืื ืืืชืืื ืืจืืช ืืืืฉืง. ืืืขืชื ืืืื ืืจื ืขืงืจืื ืืคืจืืช ืืืฉืง, ืื ืฉืืจืื ืฉืืขืฉื ืื ืืคืืืฆืืืช ืืืืื ืืช ืฉื ืืคืืกืื ืืขืงืจืื ืืช ืืืคืืง ืืื ืืืฉื ื ืืืฉืคื :) ืืืืื ืฉืื ืื ืคืจืืืงื ืฆืจืื ืืคืฉืื ืืื ืืืืืจืช ืืฉืืืืช, ืืื ืื ื ืืืืืง ืืืชื ืืช ืืืจืืง. ืืฉืื ืืจืืฉืื ื ืฉื ืืืืฉืื ืคืืชืื, ืืชื ืืืื ืคืฉืื ืืืฆืืจ ืืืชื PostQueries ืขื ืืืืฉืื ืืจืืื ืืืืฆืขืืช Eloquent:
<?php
final class PostQueries
{
public function getById($id): Post
{
return Post::findOrFail($id);
}
// ะดััะณะธะต ะผะตัะพะดั
}
ืืืฉืจ ืืชืขืืจืจ ืืฆืืจื ืืืืืื, ืืขืืจืช ืืืื ืคืฉืื ื ืืชื ืืืฆืืจ ืืืฉืง (ืื ืืืืงื ืืืกืืจืงืืืช) ืืืงืื ืืืืืงื ืืื PostQueries, ืืขืชืง ืืช ืืืืฉืื ืฉืื ืืืืชื EloquentPostQueries ืืขืืืจ ืืชืื ืืช ืฉืชืืืจืชื ืงืืื. ืืื ืฆืืจื ืืฉื ืืช ืืช ืฉืืจ ืงืื ืืืคืืืงืฆืื.
ืื ืืืจืืงืื ืืืื ืขื ืฉืืขืืจืื, ืืืฉืงืื, ืืืจืงืช ืชืืืช ะธ CQRS ืืชืืืจ ืืคืืจืื ื
ืืงืืจ: www.habr.com