Где нужно в репозиторий подать другой Persistence по условию? Репозиторий осуществляет выборку данных по средством Persistence. Есть два Persistence . Например memoryи databese. Может даже есть memcahed.
Где нужно воткнуть условие что если memory Persistence вернул 0 то тогда иди к databese Persistence?
И ещё более важно в каком месте осуществиться кеширование из db в memory Persistence. Вернее где это делить правильнее с точки зрения ООП.
Приблизительный код:class MyController{
function postsAction(){
$memoryRepository = new PostsRepository(new PostsMemoryPesistence());
if( empty( $posts = $memoryRepository->getAll() ) ) {
$posts = (new PostsRepository(new PostsDBPesistence()))->getAll();
$memoryRepository->save( $posts )
}
}
}
class PostsRepository{
function __constructor(Presistence presistence){
this->presistence = presistence;
}
function getAll(){
return this->presistence->getAll();
}
function save( Posts[] $posts ){
foreach($posts as $post){
this->presistence->save( $post );
}
}
}
interface Presistence{
function getAll();
functions save();
}
class PostsMemoryPesistence implements Presistence{
$posts;
function getAll(){}
functions save(){}
}
class PostsDBPesistence implements Presistence{
$db;
function getAll(){}
functions save(){}
}
На мой взгляд надо убрать логику условия и сохранения из контроллера. Вопрос куда?

21 Авг 2019 в 06:59
176 +1
0
Ответы
1

Логику условия и сохранения можно вынести в отдельный класс, который будет отвечать за выбор Persistence и кеширование данных. Например, создайте класс CacheManager, который будет принимать в конструкторе оба Persistence (memory и database), и реализует методы для выбора нужного Persistence и кеширования данных.

Примерно так:

class CacheManager {
private $memoryPersistence;
private $dbPersistence;
function __constructor(Persistence $memoryPersistence, Persistence $dbPersistence){
$this->memoryPersistence = $memoryPersistence;
$this->dbPersistence = $dbPersistence;
}
function getAllPosts(){
$posts = $this->memoryPersistence->getAll();
if(empty($posts)){
$posts = $this->dbPersistence->getAll();
$this->memoryPersistence->save($posts);
}
return $posts;
}
}
class MyController{
function postsAction(){
$memoryPersistence = new PostsMemoryPesistence();
$dbPersistence = new PostsDBPesistence();
$cacheManager = new CacheManager($memoryPersistence, $dbPersistence);
$posts = $cacheManager->getAllPosts();
}
}

Таким образом, вы избавляетесь от логики условия в контроллере и выносите ее в отдельный класс CacheManager, что делает код более чистым и поддерживаемым с точки зрения ООП.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир