Как бы вы сделали систему комментариев с ревизией? - PullRequest
2 голосов
/ 27 апреля 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Посмотрите на Versionable в DoctrineExtensions

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

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

0 голосов
/ 27 апреля 2011

Примерно так ... Я позволю вам заполнить пробелы:

<?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"

Я не проверял это, ноВы поняли ...

...