2013-12-13 5 views
0

Мне приходится иметь дело с «измерительными цепями», каждый из которых состоит из 1 измерительного прибора и нескольких резервуаров. Цепи, инструменты и танки находятся в месте.Выполнение действия другого контроллера

Очевидно, что цепи в местоположении А не может состоять из элементов, расположенных в Location B или C.

Поэтому у меня есть следующие объекты:

  • ЦЕПЬ
    • chain_id
    • location_id
    • instrument_id
    • date_creation
    • date_destruction
  • ИНСТРУМЕНТ
    • instrument_id
    • LOCATION_ID
  • БАК
    • tank_id
    • LOCATION_ID
  • TANK_IN_CHAIN ​​
    • tank_in_chain_id
    • tank_id
    • chain_id
    • date_connection
    • date_disconnection
  • МЕСТОПОЛОЖЕНИЕ
    • LOCATION_ID

То, что я хочу сделать, это:

  • Когда я переместить инструмент в новое место (MoveAction() в InstrumentController), цепь должна быть detroyed
  • Когда я двигаю танк в новом месте (moveAction() в TankController), цепь должна быть разрушена
  • «Уничтожение» Цепочка означает: chain.date_destruction установлен на now() и tank_in_chain.date_disconnection, установленный в настоящее время() для всех соответствующих танков , Это делается в destroAction в ChainController (потому что иногда мне нужно уничтожить цепи даже если прибор или танк не переместились)

Моя проблема:

Как вызвать ChainController :: destroyAction () от InstrumentController :: moveAction() или TankController :: moveAction()?

Я читал о функции forward(), но из того, что я понял, это не то, что мне нужно. Другая возможность, которую я вижу, - установить ChainController как службу, но я не уверен, что это правильный способ решить эту проблему, то есть она может работать, но это не «хорошая практика».

Как вы думаете?

Цистерны для любой помощи! Cheers.

ответ

0

Считаете ли вы использование прямого метода внутри контроллера?

Но для меня правильное место для обработки изменений в сущности, которая может привести к изменению другого объекта, находится на уровне Entity. Это означает, что у вас должен быть какой-то метод слушателя в вашей сущности для прослушивания изменения этого объекта, чтобы он мог инициировать изменение связанного объекта. В вашем случае, я бы:

  • метод PostUpdate на Instrument сущности
  • метод PostUpdate на Tank объекта
  • Затем в каждом из этого метода, установите date_destruction в настоящее время для соответствующей цепочки сущности.

Взгляните на Doctrine жизненный цикл обратного вызова http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks

+0

Спасибо. Обратные вызовы жизненного цикла кажутся слишком простыми для моего случая (пример, который я дал, упрощен для лучшего понимания), но, читая документ, кажется, что некоторые «нормальные» события могут сделать работу правильно. Я исследую это. – Blacksad

+0

Да, я предпочитаю использовать прослушиватель событий в этом случае. И вы могли бы даже связать его с услугами для удобства тестирования :) – passkey1510

+0

Мне удалось создать Event и Listener, чтобы уничтожить цепочку, когда движется инструмент или танк. Теперь я пытаюсь отключить Танки, когда Цепь разрушена вышеупомянутыми событиями. Другими словами, я хочу вызвать событие из EventListener, но функция get() в: $ this-> get ('event_dispatcher') -> dispatch (CoreEvents :: onChainDestruction, $ event); не распознается вне контроллера. Я нашел много подобных проблем в Интернете, но мне все еще не ясно, как это сделать. Есть идеи? – Blacksad

0

Хорошим способом для этого является определение вашего controller as service.

+0

Спасибо за ваш ответ. Я видел эту возможность, но на странице Cookbook Service Container написано, что «Служба - это любой объект PHP, который выполняет какую-то глобальную задачу», например mailling. На самом деле это не мой случай, этот detroyAction() не является глобальным: например, я не хочу обращаться к нему с LocationController. Вот почему я подумал, действительно ли это правильно. – Blacksad

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