2014-09-01 2 views
1

Рассмотрите следующую ситуацию. У меня есть объект, который содержит некоторую информацию, скажем, новость. Эта новость содержит комментарии.Как изящно войти в объект Doctrine2

В объекте элемента новостей есть функция calculateStatistics(), которая возвращает некоторую статистику, полученную из объекта новостей, а также его комментарии. Раньше у меня была эта функция вычисления внутри NewsService, но затем выяснилось, что услуга не нужна, потому что я использую только информацию, находящуюся внутри объекта.

В настоящее время функция расчета также выполняет некоторую проверку работоспособности. Я хочу регистрировать отрицательные результаты в качестве предупреждения в моей службе Монолог. Я по-прежнему полагаю, что в данный момент действительно есть функция вычисления внутри объекта, поскольку никакой внешней информации/услуги не требуется. Есть ли элегантный способ поддержки ведения журнала внутри объекта?

+1

Не все равно слишком много о сарказме, но .. . Изящный способ - не регистрироваться в сущности;) Расчет почему нет, но не протоколирование. Помните, что Doctrine позволяет загружать частичные объекты, так что некоторые свойства могут быть NULL, тогда как они оцениваются в DB, ​​так что вычисление в сущности даже не очень хорошая идея. Автоматизация этого процесса с событием кажется хорошим способом. – AlterPHP

+0

Я думаю, что это хороший вопрос. В настоящее время логика домена в наших сущностях генерирует исключения, что приводит к сбоям наших приложений в неизвестных местах. Мы могли бы также вернуть разумные значения по умолчанию, и пусть сущности регистрируют эти случаи для довольно некоторых из этих случаев. – Rvanlaak

ответ

1

Я не думаю, что обработка журнала внутри Entity - хорошая идея, поскольку сущность должна быть как можно более независимой и не иметь бизнес-логики внутри. Я бы предложил сделать это event listener. Рассмотрим такую ​​конфигурацию (я предполагаю, что вы используете Doctrine и хотите выполнить регистрацию, а какой-то доктрины случае - но если нет, то у вас будет только изменить название события, которое вы слушаете):

Entity:

class YourEntity implements StatisticInterface 
{ 
    (...) 
    public function calculateStatistics() 
    { 
     (...) 
    } 

} 

config.yml

your_service.statistics_listener: 
     class: Acme\DemoBundle\EventListener\Entity\StatisticsEntityListener 
     arguments: [@logger] 
     tags: 
      - { name: doctrine.event_listener, event: prePersist } 

prePersist является одним из many возможных событий, просто выбрать тот, который подходит для большинства

StatisticsEntityListener

class StatisticsEntityListener 
{ 
    public function __construct(Logger $logger) 
    { 
     $this->logger = $logger; 
    } 

    /** 
    * @param LifecycleEventArgs $args 
    */ 
    public function prePersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     if ($entity instanceof StatisticInterface) { 
      //do whatever you like with your logger and entity 
      $logger->log($entity->calculateStatistics()); 
     } 
    } 
} 

Таким образом, вы получите хорошее разделение задач, и вы можете войти, используя данные ваш Monolog

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