Symfony2: Где размещать методы slug и timestamp? - PullRequest
2 голосов
/ 24 марта 2012

Я кодирую сервис, который будет обрабатывать статьи (CRUD).

Слой персистентности обрабатывается ArticleManager>, который выполняет действия с репозиторием и CRUD.

Теперь я хочуреализовать два атрибута: createAt и> updatedAt

Мой вопрос сейчас, где я должен их разместить: в сущности, в ArticleManager, где-нибудь еще?

Best Regards, Bodo

Ах,

Понятно, FOSUserBundle выполняет эту задачу с помощью EventListener:

https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Entity/UserListener.php

Но спасибо вам за помощь:)

<?php

namespace LOC\ArticleBundle\Entity;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Events;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use LOC\ArticleBundle\Model\ArticleInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;


class ArticleListener implements EventSubscriber
{
private $articleManager;
private $container;

public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}

public function getSubscribedEvents()
{
    return array(
        Events::prePersist,
        Events::preUpdate,
    );
}

public function prePersist(LifecycleEventArgs $args)
{
    $article = $args->getEntity();

    $article->setCreatedAt(new \DateTime());

    $this->articleManager->updateArticle($article);
}

public function preUpdate(PreUpdateEventArgs $args)
{
    $article = $args->getEntity();

    $article->setUpdatedAt(new \DateTime());

    $this->articleManager->updateArticle($article);
}
}

Ответы [ 2 ]

11 голосов
/ 24 марта 2012

Ну, есть пакет для таких вещей, DoctrineExtensionsBundle .Он получил метку времени и слаг.

Если вы хотите сделать это самостоятельно, место определенно находится в самой сущности, поскольку вы не хотите возиться с вашим контроллером.Вот как я делаю Timestampable, поскольку я не использую DoctrineExtensionsBundle:

/**
 * @ORM\Entity
 * @ORM\Table(name="entity")
 * @ORM\HasLifecycleCallbacks
 */
class Entity {
    // ...

    /**
     * @ORM\Column(name="created_at", type="datetime", nullable=false)
     */
    protected $createdAt;

    /**
     * @ORM\Column(name="updated_at", type="datetime", nullable=false)
     */
    protected $updatedAt;

    /**
     * @ORM\prePersist
     */
    public function prePersist() {
        $this->createdAt = new \DateTime();
        $this->updatedAt = new \DateTime();
    }

    /**
     * @ORM\preUpdate
     */
    public function preUpdate() {
        $this->updatedAt = new \DateTime();
    }

    // ...

}

Что касается моего решения не использовать Bundle: Когда symfony2 был выпущен как стабильный, этот пакет не существовал (илиэто не было стабильно, я не помню), поэтому я начал делать это самостоятельно, как показано ниже.Поскольку это немного накладные расходы, я продолжал делать это так и никогда не чувствовал необходимости менять это.Если вам нужен Slugable или вы хотите сохранить его просто, попробуйте пакет!

2 голосов
/ 24 марта 2012

В сущности, поскольку они принадлежат ей логически.

...