【问题标题】:Symfony2: Where place slug and timestamp methods?Symfony2:在哪里放置 slug 和时间戳方法?
【发布时间】:2012-03-24 12:42:51
【问题描述】:

我正在编写一个处理文章 (CRUD) 的服务。

持久层由 ArticleManager 处理,它执行 Repository 和 CRUD 操作。

现在我要实现两个属性:createdAt 和 >updatedAt

我现在的问题是我应该把它们放在哪里: 在实体中,在 ArticleManager 中,在其他什么地方?

最好的问候, 博多

啊,

我明白了,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);
}
}

【问题讨论】:

    标签: php symfony doctrine-orm entity


    【解决方案1】:

    嗯,这些东西有一个捆绑包,DoctrineExtensionsBundle。它得到了 Timestampable 和 slugable。

    如果你想自己做,这个地方肯定在实体本身,因为你不想在你的控制器里乱来。这是我不使用 DoctrineExtensionsBundle 时执行 Timestampable 的方法:

    /**
     * @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 以稳定版发布时,这个 bundle 并不存在(或者它不稳定,我不记得了)所以我开始自己做,如图所示以下。由于开销很小,我一直这样做,从不觉得有必要改变它。如果您需要 Slugable 或想简单地保留它,请尝试捆绑!

    【讨论】:

    • 仅供参考,new \DateTime 足以获取当前日期时间。
    • 你是对的。不知道为什么我把它放在那里,但“现在”确实是默认设置。感谢您的提示!将其删除!
    • 嗨,ArticleBundle 用作服务,我通过 articleManager 访问实体。那么放置一个受保护的方法 generateSlug 并在 createArticle-method 中设置属性 createdAt 和在 updateArticle-method 中设置 updatedAt 不是更好吗我希望我写的这个可以理解:)
    • 为什么这样会更好?是否有任何示例您可以想到要在哪里更新实体并保持 updatedAt 不变?如果没有,请将代码保留在您的实体中,这样任何类都不必知道此时间戳的功能。您的经理不需要知道何时或如何更新此类内部行为。
    • 我同意!但是我应该如何详细实现这一点:我有一个抽象类,其中包含设置器和获取器以及模型/文章的属性。这个类被扩展为 ORM、ODM、CouchDB、Propel 等等。我可以使用构造函数处理 createdAt,但是 updatedAt 和 slug 是什么?
    【解决方案2】:

    在实体中,因为这是它们在逻辑上属于的地方。

    【讨论】:

    • 嗨,ArticleBundle 用作服务,我通过 articleManager 访问实体。那么放置一个受保护的方法 generateSlug 并在 createArticle-method 中设置属性 createdAt 和在 updateArticle-method 中设置 updatedAt 不是更好吗我希望我写的这个可以理解:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多