执行另一个的Controller动作

时间:2013-12-13 08:15:30

标签: symfony

我必须处理“测量链”,每个测量链由1个测量仪器和几个罐组成。链条,仪器和坦克都在一个位置。

显然,位置A中的链不能由位于位置B或C的元素组成。

所以我有以下对象:

  • CHAIN
    • chain_id
    • LOCATION_ID
    • INSTRUMENT_ID
    • date_creation
    • date_destruction
  • INSTRUMENT
    • INSTRUMENT_ID
    • location_id
  • TANK
    • tank_id
    • location_id
  • TANK_IN_CHAIN
    • tank_in_chain_id
    • tank_id
    • chain_id
    • date_connection
    • date_disconnection
  • LOCATION
    • LOCATION_ID

我想做的是:

  • 当我在新位置移动乐器(InstrumentController中的moveAction())时,应该销毁该链
  • 当我在新位置移动Tank时(TankController中的moveAction()),链条应该被销毁
  • “销毁”链意味着:chain.date_destruction设置为now(),tank_in_chain.date_disconnection设置为now(),用于所有相关坦克。这是在ChainController中的destroAction中完成的(因为有时即使没有仪器或坦克移动,我也需要销毁链条)

我的问题是:

如何从InstrumentController :: moveAction()或TankController :: moveAction()调用ChainController :: destroyAction()?

我读到了关于forward()函数,但据我所知,这不是我需要的。 我看到的另一种可能性是将ChainController设置为服务,但我不确定这是解决此问题的正确方法,即它可能有效,但这不是“良好实践”。

您怎么看?

坦克提供任何帮助! 欢呼声。

2 个答案:

答案 0 :(得分:0)

这样做的好方法是定义controller as service

答案 1 :(得分:0)

您是否考虑在控制器内部使用正向方法?

但对我来说,处理可能导致另一个实体发生变化的实体变更的正确位置是实体级别。这意味着您应该在实体中使用一些侦听器方法来侦听此实体的更改,以便它可以触发相关实体的更改。在你的情况下,我会:

  • Instrument实体上的PostUpdate方法
  • Tank实体上的PostUpdate方法
  • 然后在每种方法中,为相关的Chain实体设置date_destruction为现在。

查看Doctrine生命周期回调http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks