Как бы вы создали систему комментариев с доработкой?

#php #database #design-patterns #database-design #doctrine-orm

#php #База данных #шаблоны проектирования #database-design #doctrine-orm

Вопрос:

Мне нужно внедрить систему комментариев с ревизией.

Я использую Doctrine2.

Мне нужно, чтобы all сохранял все комментарии при их редактировании, но отображал только последние на данный момент, однако мне нужно иметь возможность отображать все старые комментарии и всегда показывать количество комментариев

Ответ №1:

Взгляните на Versionable в DoctrineExtensions

По сути, вы создаете свою сущность implementate Versionable и добавляете поле версии. Она поставляется в комплекте с VersionManager, позволяющим выполнять откат к определенным версиям.

В поле version объекта будет указано количество ревизий.

Комментарии:

1. довольно интересно, я посмотрю

Ответ №2:

Что-то вроде этого… Я позволю вам заполнить пробелы:

 <?php

/** @Entity */
class Comment
{

    private $name;

    private $email;

    private $website;

    /** @OneToMany(targetEntity="CommentVersion") */
    private $versions;

    public function __construct($name, $website, $email, $comment)
    {
        $this->name = $name;
        $this->email = $email;
        $this->website = $website;
        $this->setComment($comment);
    }

    public function setComment($text)
    {
        $this->versions->add(new CommentVersion($text));
    }

    public function getComment()
    {
        $latestVersion = false;
        foreach($this->versions as $version){
            if(!$latestVersion){
                $latestVersion = $version;
                continue;
            }

            if($version->getCreatedAt() > $latestVersion->getCreatedAt()){
                $latestVersion = $version;
            }
        }

        return $latestVersion->getComment();
    }

    public function getRevisionHistory()
    {
        return $this->comments->toArray();
    }

}

/** @Entity */
class CommentVersion
{

    /** @Column(type="string") */
    private $comment;

    /** @Column(type="datetime") */
    private $createdAt;

    public function __construct($comment)
    {
        $this->comment   = $comment;
        $this->createdAt = new DateTime();
    }

    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    public function getComment()
    {
        return $this->comment;
    }

}
  

Использование довольно простое:

 <?php

$comment = new Comment("Cobby", "http://cobbweb.me", "my@email.com", "Some comment text");
$em->persist($comment);
$em->flush();

$comment->getComment(); // Some comment text

$comment->setComment("Revision 2");
$dm->flush();

$comment->getComment(); // Revision 2

$comment->getRevisionHistory();
// CommentVersion(0): "Some comment text"
// CommentVersion(1): "Revision 2"
  

Я не тестировал это, но вы поняли идею…