2015-06-03 4 views
1

Я чувствую себя глупо, задавая этот вопрос, но я не могу найти четкий ответ нигде.Внесите параметр в объект в symfony2

У меня есть объект 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()...? и что, если мне нужно использовать параметр token_lifespan в моем классе репозитория?

Извините, там около миллиона вопросов. Я чувствую, что часть инъекции зависимостей в документах Symfony предполагает, что я знаю гораздо больше о структуре, чем в настоящее время.

ответ

1

Вы должны получить логику от сущности и сделать с ней сервис. Сущность не должна иметь никаких зависимостей.

настройки службы, чтобы %token_lifespan% в качестве аргумента и сделать метод, как это:

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

Я надеюсь, что это поможет вам начать работу.

+0

Кроме того, я полностью согласен, он технически не отвечает на его вопрос :) – DerStoffel

+1

Ну, его вопрос состоит из нескольких вопросов, поэтому я взял на себя смелость написать ответ, который мог бы помочь ему самому ответить на все: P –

+1

Итак, с точки зрения передового опыта, я должен поместить всю бизнес-логику своей сущности в сервисы, оставив объекты как модели данных базы данных? Только что написав это, это звучит очень логично! – jxmallett

1

Давайте сосредоточимся на этом:

Я смотрел на то, чтобы услуги, а также инъекции зависимостей, как способ передать маркер продолжительности жизни к маркеру, когда он будет создан, но я не могу что я делаю.

Я настоятельно рекомендую использовать, в частности, Event Listener,prePersist. Зачем? Просто, если вы передаете свою жизнь слушателю событий, и там вы подсчитаете дату истечения срока действия, вы можете установить эту дату для своей сущности и использовать ее позже, когда это необходимо.Цитата Doctrine документации о prePersist событий:

prePersist - Событие prePersist происходит для данного объекта до соответствующего EntityManager сохраняются операции для этого объект выполняется. Следует отметить, что это событие запускается только при первоначальном сохранении объекта (т. Е. Оно не запускается при будущих обновлениях).

Итак, что вам нужно сделать? Зарегистрировать класс слушателя первым:

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 как сервис не будет работать для вас, если вам нравится. Но в любом случае попробуйте.

+0

Спасибо за информацию и особенно за образец! Я бы предпочел не сохранять время истечения срока действия базы данных, так как это означает, что изменение конфигурации не будет отражено в времени истечения срока действия существующих токенов. Думаю, я, вероятно, в конечном итоге пойду с ответом Марселя. Я нахожу глупо, насколько сложно, однако, передавать значения конфигурации в Symfony. – jxmallett

Смежные вопросы