Php 将参数注入symfony2中的实体
问这个问题我觉得很傻,但我在任何地方都找不到明确的答案 我有一个Php 将参数注入symfony2中的实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,问这个问题我觉得很傻,但我在任何地方都找不到明确的答案 我有一个令牌实体,其中包括创建时间 我在parameters.yml中有一个名为token\u lifespan的参数 对于令牌,如果creation\u timegetDoctrine()…从条令中取回令牌吗?如果我需要在我的存储库类中使用token\u lifespan参数,该怎么办 抱歉,里面有一百万个问题。我觉得Symfony文档的依赖项注入部分假设我对框架的了解比我现在知道的要多。你应该从实体中获取逻辑,并用它来提供服务。实体不应
令牌
实体,其中包括创建时间
我在parameters.yml
中有一个名为token\u lifespan
的参数
对于令牌,如果creation\u time<(time()-token\u lifespan)
则该令牌已过期
问题是我找不到一个好方法将token\u lifespan
参数传递给实体。我知道我可以这样做:
$token->hasExpired($this->getParameter('token_lifespan'))
mytoken_repository:
class: MyBundle\Entity\MyToken
factory_service: 'doctrine.orm.default_entity_manager'
factory_method: 'getRepository'
calls:
- [setLifespan, ['%token_lifespan%']]
但那感觉真的很恶心。我一直在考虑创建一个服务和依赖注入,作为在创建令牌时将令牌生命周期传递给令牌的一种方式,但我不知道我在做什么
我用$token=newmytoken()制作我的代币代码>我从条令中得到了我的代币,如下所示:
$this->getDoctrine()
->getRepository('MyBundle:MyToken')
->find($token_id);
我是否需要将我的存储库设置为服务?比如:
$token->hasExpired($this->getParameter('token_lifespan'))
mytoken_repository:
class: MyBundle\Entity\MyToken
factory_service: 'doctrine.orm.default_entity_manager'
factory_method: 'getRepository'
calls:
- [setLifespan, ['%token_lifespan%']]
这到底意味着什么?我是否仍然使用newmytoken()
以相同的方式创建令牌?然后在MyToken
类中创建一个setLifespan
方法来存储寿命
最后,我还可以用$this->getDoctrine()…
从条令中取回令牌吗?如果我需要在我的存储库类中使用token\u lifespan
参数,该怎么办
抱歉,里面有一百万个问题。我觉得Symfony文档的依赖项注入部分假设我对框架的了解比我现在知道的要多。你应该从实体中获取逻辑,并用它来提供服务。实体不应具有任何依赖项
您将服务配置为将%token\u lifespan%
作为参数,并创建如下方法:
/**
* @return boolean
*/
function isExpired(Token $token) {
//your logic here, add dependencies to constructor and "arguments:" in service configuration
}
我希望这能让您开始学习。让我们关注以下内容:
我一直在考虑创建一个服务和依赖注入,作为在创建令牌时将令牌生命周期传递给令牌的一种方式,但我不知道我在做什么
我强烈建议您特别使用prePersist
。为什么?简单地说,如果您将您的生命周期传递给事件侦听器,并在那里计算您的到期日期,那么您可以将该日期设置为您的实体,并在需要时稍后使用它。引用条令
有关prePersist
事件的文档:
prePersist—在对给定实体执行相应的EntityManager持久化操作之前,该实体会发生prePersist事件。应注意,此事件仅在实体的初始持久化时触发(即,它不会在将来的更新时触发)
那么,你需要做什么?首先注册侦听器类:
token.listener:
class: MyBundle\EventListener\TokenListener
arguments:
- %token_lifespan%
tags:
- { name: doctrine.event_listener, event: prePersist }
有了它,您可以轻松地将令牌\u寿命作为构造函数传递给类
然后,您需要创建类本身:
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(....);
}
}
}
如果您愿意,我可以解释为什么将存储库
创建为服务对您不起作用。但无论如何,试试看。另外,我完全同意,从技术上讲,这并不能回答他的问题:)好吧,他的问题由多个问题组成,所以我冒昧地写了一个答案,可能会帮助他自己回答所有问题:PSo,就最佳实践而言,我应该将我所有的实体业务逻辑都放在服务中,将实体仅仅作为数据库信息的模型?刚刚写完,听起来很合乎逻辑!是的,我就是这样做的。它可能并没有严格地回答我最初的问题,但它回答了更高层次的问题,这可以说是更好的。我最后这么做了,所以我接受了这个答案。谢谢你的信息,特别是示例代码!我不希望将过期时间保存到数据库中,因为这意味着配置更改不会反映在现有令牌的过期时间中。我想我最终可能会同意马塞尔的答案。不过,我确实觉得在Symfony中传递配置值似乎很难,这很愚蠢。