代码之家  ›  专栏  ›  技术社区  ›  Alcalyn

如何不引导所有捆绑包?

  •  4
  • Alcalyn  · 技术社区  · 10 年前

    我有一个symfony2应用程序,它由一个站点和许多游戏组成。

    因此,我创建了一个CoreBundle(网站),并为每个与核心交互的游戏创建了捆绑包。

    游戏包与核心进行交互(更新玩家分数),核心通知游戏什么时候发生了变化,游戏应该做什么(例如,在核心中创建了一个游戏实例,因此游戏应该初始化与自身相关的数据)。

    Bundles architecture

    此时此刻,我在两种建筑观点之间犹豫不决。

    • 首先,为了做到这一点,我创建了一个 界面 每个游戏都必须实现。在这个界面中,许多方法在游戏工作流的不同时刻被调用。这是可行的,但这不是一个很好的模式,接口中的方法一次又一次地增长,即使我创建了一个适配器,这也使得游戏必须实现太多的方法。

    • 其次,我决定使用 事件 为了使界面更轻,游戏可以收听内核触发的一些事件。

    这也是可行的,这是一个很好的模式,但我觉得另一个不方便:

    每个游戏都会监听相同的事件,因此如果玩家创建了任何游戏的游戏实例(那么核心会发送事件 event.game.created ),每一场比赛都会得到通知。

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

    但我有太多的游戏,这使得太多的方法毫无用处,对于每一个事件。。。

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

    不方便的住宿:

    我有很多游戏,然后有很多免费启动的游戏包,因为在查询中只使用核心包,可能还有一个游戏包。

    你有什么想法或同样的问题吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Alcalyn    10 年前

    所以 我们不能启动捆绑包,也不能不启动,这取决于路线 ,因为正如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 }
    

    当然,在开发环境中,捆绑包总是加载的,但在生产环境中 隐藏物 做它的工作。。。