Где нужно в репозиторий подать другой 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
157 +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 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир