在symfony2

时间:2015-06-03 07:26:32

标签: php symfony doctrine-orm

我觉得这个问题很傻,但我无法在任何地方找到明确答案。

我有一个token实体,其中包含creation_time

我在parameters.yml中有一个名为token_lifespan的参数。

对于令牌,如果creation_time < (time() - token_lifespan)则已过期。

问题是我找不到将token_lifespan参数传递给实体的好方法。我知道我可以这样做:

$token->hasExpired($this->getParameter('token_lifespan'))

但这感觉真的好看。我一直在寻求提供服务和依赖注入,作为在创建令牌时将令牌生命周期传递给令牌的方法,但我无法理解我正在做的事情。

我正在用$token = new MyToken();制作我的代币,而我正在接受这样的代币:

$this->getDoctrine()
    ->getRepository('MyBundle:MyToken')
    ->find($token_id);

我是否需要将存储库设为服务?类似的东西:

mytoken_repository:
    class:  MyBundle\Entity\MyToken
    factory_service: 'doctrine.orm.default_entity_manager'
    factory_method:  'getRepository'
    calls:
         - [setLifespan, ['%token_lifespan%']]

这究竟是什么意思?我仍然使用new MyToken()以相同的方式创建令牌吗?只需在setLifespan类中创建一个MyToken方法来存储生命周期?

最后,我还可以使用$this->getDoctrine()...从Doctrine获取令牌吗?如果我需要在我的存储库类中使用token_lifespan参数怎么办?

抱歉,那里有大约一百万个问题。我觉得Symfony文档中的依赖注入部分假设我对框架的了解比我目前要多得多。

2 个答案:

答案 0 :(得分:1)

您应该从实体中获取逻辑并使用它创建服务。实体不应该有任何依赖。

您将服务配置为将%token_lifespan%作为参数,并创建如下方法:

/**
 * @return boolean
 */
function isExpired(Token $token) {
   //your logic here, add dependencies to constructor and "arguments:" in service configuration
}

我希望这能让你开始。

答案 1 :(得分:1)

让我们专注于此:

  

我一直在寻求提供服务和依赖注入,作为在创建令牌时将令牌生命周期传递给令牌的方法,但我无法解决我正在做的事情。

我强烈建议您特别使用Event Listener, prePersist。为什么?简单地说,如果您将生命周期传递给事件监听器,并计算到期日期,则可以将该日期设置为您的实体,并在以后需要时使用。引自Doctrine关于prePersist事件的文档:

  

prePersist - 在执行该实体的相应EntityManager持久操作之前,对于给定实体发生prePersist事件。应该注意的是,此事件仅在实体的初始持久性时触发(即,在未来的更新中不会触发)。

那么,你需要做什么?首先注册监听器类:

token.listener:
    class: MyBundle\EventListener\TokenListener
    arguments:
        - %token_lifespan%
    tags:
        - { name: doctrine.event_listener, event: prePersist }

有了这个,您可以轻松地将token_lifespan作为构造函数传递给您的班级。

然后,您需要创建类本身:

namespace MyBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use MyBundle\Entity\Token;

class TokenListener
{
    /**
     * @var int
     **/
    private $token_lifespan = null;

    public function __construct($tokenLifespan) {
        $this->token_lifespan = $tokenLifespan;
    }

    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        // Do your magic here, only if our class is of type Token
        if ($entity instanceof Token) {
            // Calculate your expiration date here using $this->token_lifespan
            // and once you're done, set the result to the entity

            $entity->setExpirationDate(....);
        }
    }
}

如果您愿意,我可以解释为什么创建Repository作为服务对您不起作用。但无论如何,试一试。