Symfony 如何不启动所有捆绑包?

Symfony 如何不启动所有捆绑包?,symfony,events,optimization,architecture,symfony-2.3,Symfony,Events,Optimization,Architecture,Symfony 2.3,我有一个symfony2应用程序,它由一个站点和许多游戏组成 因此,我创建了一个CoreBundle(站点),并为每个与core交互的游戏创建了一个捆绑包 Games bundle与core交互(更新玩家分数),core会在某些内容发生更改且游戏应该执行某些操作时通知游戏(例如,在core中创建了一个游戏实例,因此游戏应该初始化与自身相关的数据) 此时此刻,我在两种建筑观点之间犹豫不决 首先,为了做到这一点,我创建了一个每个游戏都必须实现的接口。在这个界面中,许多方法在游戏工作流的不同时刻被

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

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

Games bundle与core交互(更新玩家分数),core会在某些内容发生更改且游戏应该执行某些操作时通知游戏(例如,在core中创建了一个游戏实例,因此游戏应该初始化与自身相关的数据)

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

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

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

这也行得通,这是一个很好的模式,但另一个不方便的地方来了:

每个游戏都会监听同一个事件,因此如果玩家创建了任何游戏的游戏实例(然后核心调度事件
event.game.created
),则会通知每个游戏

我可以在每个游戏侦听器方法中添加一个条件,比如
if(game.name!==“chess”)return

但我有太多的游戏,这使得太多的方法毫无意义,每一个事件

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

麻烦又来了:

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


您是否有一些想法或相同的问题?

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

因此,我通过使用事件调度器组件,特别是事件订阅者(),解决了我的问题:

而不是在
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 }

确保在dev环境中始终加载捆绑包,但在prod环境中,缓存执行其工作…

缓存使根据路由控制加载哪些捆绑包变得很困难。而不是游戏捆绑,考虑他们作为图书馆,并有核心选择库使用的路线。例如,核心将确定游戏类型,然后激活该游戏类型的侦听器。然后开始发送消息。我想,当你说“激活该游戏类型的侦听器”时,我已经找到了解决方案的开始。游戏实际上是在他们的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 }