如何不启动所有捆绑?

时间:2014-07-17 09:14:02

标签: symfony events optimization architecture symfony-2.3

我有一个symfony2应用程序,它包含一个包含许多游戏的网站。

所以我创建了一个CoreBundle(网站),以及每个与核心交互的游戏的捆绑包。

游戏包与核心交互(更新玩家得分),当核心发生变化并且游戏应该做某事时(例如,游戏实例已在核心中创建,因此游戏应初始化与之相关的数据),核心会通知游戏本身)。

Bundles architecture

此时此刻,我对两种架构观点犹豫不决。

  • 首先,为此,我创建了一个每个游戏必须实现的界面。在这个界面中,许多方法在游戏工作流程的不同时刻被调用。这是有效的,但它不是一个非常好的模式,并且界面中的方法一次又一次地增长,即使我创建了一个适配器,这使得游戏必须实现太多方法。

  • 其次,我决定使用事件来简化界面,游戏可以听取核心触发的某些事件。

这也有效,这是一个很好的模式,但另一个不方便来了我:

每个游戏都会听同一个事件,所以如果玩家创建任何游戏的游戏实例(然后核心发送事件event.game.created),则会通知每个游戏。

我可以在每个游戏监听器方法中添加条件,例如if (game.name !== 'chess') return;

但是我有太多的游戏,而且每个事件都会产生太多无法控制的方法......

这就是为什么我回到第一个方法,调用一个接口方法,然后我确信调用好游戏包的方法,而不是所有游戏方法,当核心通知游戏实例创建或任何其他事件。

不方便再次入住:

我有很多游戏,然后是许多游戏包,它们都是无用启动的,因为在查询中只使用了核心包和一个游戏包。

你有一些想法或同样的问题吗?

1 个答案:

答案 0 :(得分:0)

所以我们无法根据路由启动捆绑包,因为正如Cerad所说,这对缓存来说是一个挑战。即使我们可以根据环境启动捆绑包。

所以我通过使用事件调度程序组件来解决我的问题,特别是事件订阅者http://symfony.com/doc/current/components/event_dispatcher/introduction.html#using-event-subscribers):

$this->get('event_dispatcher')->addSubscriber(new PartyEventSubscriber());

而不是services.yml中的注册事件侦听器:

services:
    games.chess:
        class: %chess.class%
        tags:
            - { name: kernel.event_listener, event: event.party.created, method: onPartyCreated }
            - { name: kernel.event_listener, event: event.party.started, method: onPartyStarted }
            - { name: kernel.event_listener, event: event.party.ended, method: onPartyEnded }

当然,在开发环境中,捆绑包总是被加载,但在prod环境中,缓存可以正常工作......