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中传递配置值似乎很难,这很愚蠢。