0

我目前有Test\CoreBundle打算包含基本功能以使我的网站上线(例如启动页面和基本管理面板)。

我想要做的是能够加入Test\UserBundleCoreBundle意识到我已经添加了一个新包,因此它可以将它包含在管理员面板中。我想我也许可以做类似的事情:

在我的Test\UserBundle我添加了一个 config.yml 文件,例如:

include_admin:
    directory: "users"
    name: "User Management"

(然后我会将它添加到 AppKernel.php 中)

在我的管理面板索引中:

$bundles = $this->container->getParameter('kernel.bundles');
foreach($bundles as $bundle){
  if(strpos($bundle,'Test') !== false){
    // access the config.yml file somehow for this bundle?
  }
}

在我看来,我可以做这样的事情:

<a href="/admin/{{ directory }}">{{ name }}</a>

由于对科幻一无所知,我不知道我是否会完全草率地处理这件事。

4

1 回答 1

3

您可以在 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
}

如果其他人有更简单的方法来实现这一点,我很想知道一种更简单/更清洁的方法!

于 2012-12-11T23:46:20.290 回答