我觉得这个问题很傻,但我无法在任何地方找到明确答案。
我有一个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文档中的依赖注入部分假设我对框架的了解比我目前要多得多。
答案 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
作为服务对您不起作用。但无论如何,试一试。