Где нужно в репозиторий подать другой 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(){} } На мой взгляд надо убрать логику условия и сохранения из контроллера. Вопрос куда?
Логику условия и сохранения можно вынести в отдельный класс, который будет отвечать за выбор 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, что делает код более чистым и поддерживаемым с точки зрения ООП.
Логику условия и сохранения можно вынести в отдельный класс, который будет отвечать за выбор 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, что делает код более чистым и поддерживаемым с точки зрения ООП.