i_d_1
@i_d_1
Программист PHP

Где нужно в репозиторий подать другой 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(){}
}


На мой взгляд надо убрать логику условия и сохранения из контроллера. Вопрос куда?
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
@oxidmod
я бы сделал в виде декораторов
interface Persistence {
    function getAll();
    function save($item);
}

class DBPersistence implements Persistence {
    ...
}

class CacheDecoratedPersistence implements Persistence {
    /**
      * @var Persistence
      */
    private $decorated;

    private $items;

    function getAll(){
        if (null === $this->items) {
                $this->items = $this->persistence->getAll();
        }

        return $this->items;
    }
    
     function save($item)
     {
           $this->persistence->save($item);
           $this->items[] = $item;
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmitriylanets
в Сервис
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы