Репозиторий для поиска в БД?

Есть клиент который делает выборку из БД
Есть обьект допустим Post
И есть класс-репозиторий содержащий методы; getPostById, getPostsByTitle
Вызов которых должен возвращать обьект типа Post или массив Post

репозиторий билдит Query и передает БД-клиенту и получает результат запроса, что дальше должно быть? мне надо делать что-то вроде return new Post($searchResult) ? передавать сырой результат выборки из БД в конструктор обьекта?

или как это делают

ПС. Требования что это все должно работать без доктрины.
  • Вопрос задан
  • 307 просмотров
Пригласить эксперта
Ответы на вопрос 2
turintomsk
@turintomsk
developer
Стандартно для подобных случаев реализуется класс (модель) с полным перечнем параметров для конструктора (возможно с default параметрами) и метод, создающий этот объект.
Модель:
class Post {
    private $id;
    private $title;
    private $description;
    /** ... etc ... */

    public function __construct($id, $title, $description) {
        $this->id = $id;
        $this->title = $title;
        $this->description = $description;
    }

    public function getId() {
        return $this->id;
    }
    public function getTitle() {
        return $this->title;
    }
    public function getDescription() {
        return $this->description;
    }
}

Методы класса:
class PostProvider {
    public function getPostById($id) {
        $response = /** ... Получаем данные ...  */;
        if (!$response) {
            throw new Exception('Not found.');
        }
        return $this->createPost($response);
    }
    public function getPostsByTitle($id) {
        $result = [];
        $responses = /** ... Получаем данные ...  */;
        foreach ($responses as $response) {
            $result[] = $this->createPost($response);
        }
        return $result;
    }

    /**
     * Метод возвращает объект Post по переданному массиву данных
     * @return Post
     */
    private function createPost(array $response){
        return new Post($response['id'], $response['title'], $response['description']);
    }
}
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вроде return new Post($searchResult) ?


php.net/manual/en/reflectionclass.newinstancewitho...

То что вам предстоит написать называется гидраторы. Они берут стэйт и запихивают его в объект минуя методы (напрямую по мэппингу). Альтернатива - сделать статический метод конструктор который будет делать все то же самое но уже почти без рефлексий. Третий вариант - прокси классы (то как это делает доктрина).
Ответ написан
Ваш ответ на вопрос

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

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