您可以在 CoreBundle 中创建一个侦听器来侦听其他 Bundle 的“参与”。我在下面做了类似的事情,为我希望的任何捆绑包构建基于菜单项的导航。您可以修改下面的事件和事件侦听器以传递您需要的任何数据。
基本上,您在 CoreBundle 中创建一个事件和事件侦听器,并让彼此独立的捆绑包在 CoreBundle 调度事件时注册 EventListener。
例如,在您的 CoreBundle 中,创建一个事件:
use Symfony\Component\EventDispatcher\Event;
class BundleEvent extends Event
{
const EVENT = "core.bundle.find_bundles";
private $bundles;
public function addBundle($bundle)
{
$this->bundles[] = $bundle;
}
public function getBundles()
{
return $this->bundles;
}
}
然后在你的 CoreBundle 中创建一个事件监听器:
use Acme\CoreBundle\BundleEvent;
class BundleListener
{
private $bundle_path;
public function __construct($bundle_path)
{
$this->bundle_path= $bundle_path;
}
public function addBundle(BundleEvent $event)
{
$event->addBundle($this->bundle_path);
}
}
然后,在您希望 CoreBundle 了解的每个 Bundle 的 services.xml 中,使用以下命令:
<service id="acme.user.bundle_listener" class="Acme\CoreBundle\BundleListener">
<argument>Acme\UserBundle</argument>
<tag name="kernel.event_listener" event="core.bundle.find_bundles" method="addBundle" />
</service>
最后,在您的 CoreBundle(或您需要获取此列表的其他任何地方)中,当您想要获取您正在寻找的所有捆绑包时,通过事件调度程序运行事件:
$bundles = $this->container->get('event_dispatcher')->dispatch(BundleEvent::EVENT, new BundleEvent())->getBundles();
foreach($bundles as $bundle_path) {
// .. do something
}
如果其他人有更简单的方法来实现这一点,我很想知道一种更简单/更清洁的方法!