ΠΠ° ΠΏΡΠΎΡΠ»ΠΎΠΉ Π½Π΅Π΄Π΅Π»Π΅ Ρ Π½Π°ΠΏΠΈΡΠ°Π»
<?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 Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π² ΠΎΠ±ΠΎΠΈΡ , ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ. ΠΡΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΡΡΡΡ ΠΏΠΎΠ·Π΄Π½Π΅Π΅. ΠΡΠΎ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡΡ write-ΡΠ°ΡΡΠΈ Ρ ΠΏΠΈΡΠ°Π» Π² ΠΏΡΠΎΡΠ»ΠΎΠΉ ΡΡΠ°ΡΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΡΠΎΠΉ Ρ ΠΏΡΠΎ Π½Π΅Π΅ ΠΏΡΠΎΡΡΠΎ Π·Π°Π±ΡΠ΄Ρ.
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 ΠΈ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½ ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ, ΡΡΠΎ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ°Π»ΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ. Π’ΡΡΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΌΠΈΠ½ΡΡΡ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΠΌΠΈ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠΆΠ΅ ΡΠΈΡΠ°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ. ΠΠ°Π·Ρ Π΄Π°Π½Π½ΡΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ Π½Π°Π³ΡΡΠ·ΠΊΠ°ΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β ΠΊΠ΅Ρ. ΠΡΠΎΠΌΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π½Π΅ΠΊΠΈΠΉ ΡΠ»Π΅ΠΏΠΎΠΊ Π΄Π°Π½Π½ΡΡ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌ β memcached ΠΈΠ»ΠΈ redis.
ΠΠΎΠ³ΠΈΠΊΠ° ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΡΠ°ΠΊΠ°Ρ ΡΠ»ΠΎΠΆΠ½Π°Ρ, Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ Π΅Π΅ Π² EloquentPostQueries Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ (Ρ ΠΎΡΡ Π±Ρ ΠΈΠ·-Π·Π° Single Responsibility Principle). ΠΠ°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
<?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->remember ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π΅Ρ Π»ΠΈ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ Π² ΠΊΠ΅ΡΠ΅ ΠΈ Π΅ΡΠ»ΠΈ Π½Π΅Ρ, ΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ callback ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΠΊΠ΅Ρ Π²Π΅ΡΠ½ΡΠ²ΡΠ΅Π΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½Π΅Π΄ΡΠΈΡΡ Π΄Π°Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° 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);
}
}
ΠΡΠ΅ ΠΌΠΎΠΈ ΠΏΠΎΠΆΠ΅Π»Π°Π½ΠΈΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΏΠΈΡΠ°Π² ΠΎΠ΄ΠΈΠ½ ΠΊΠ»Π°ΡΡ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠ² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠΎΠ΄ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΠ»ΡΡ.
Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π΄Π»Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠ΄Π°Π»Π΅Π½Π½Π°Ρ ΡΡΠ°ΡΡΡ Π½Π΅ Π²ΠΈΡΠ΅Π»Π° Π½Π° ΡΠ°ΠΉΡΠ΅ Π΅ΡΠ΅ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ Π° ΡΠ΄Π°Π»ΠΈΠ»Π°ΡΡ ΡΡΠ°Π·Ρ. ΠΠΎ ΡΡΠΎ ΡΠΆΠ΅ ΠΌΠ΅Π»ΠΎΡΠΈ.
ΠΡΠΎΠ³: ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π½Π΅ ΠΎΠ΄ΠΈΠ½, Π° ΡΠ΅Π»ΡΡ Π΄Π²Π° ΡΠ°Π±Π»ΠΎΠ½Π°. Π¨Π°Π±Π»ΠΎΠ½ 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