Symfony添加捆绑包并让我的'CoreBundle'实现它

时间:2012-12-11 17:35:39

标签: php symfony symfony-2.1

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

我想要做的是能够放入Test\UserBundle并让CoreBundle意识到我已经添加了一个新的捆绑包,因此它可以在管理员面板中包含它。我想我可能会做类似的事情:

在我的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>

由于对sf一无所知,我不知道我是否会完全喋喋不休。

1 个答案:

答案 0 :(得分:3)

您可以在CoreBundle中创建一个侦听器来侦听其他Bundle的“参与”。我在下面做了类似的事情,根据我希望的任何捆绑包的菜单项构建导航。您可以修改事件和下面的事件监听器传递你需要的任何数据。

基本上,你创建了一个事件&amp; CoreBundle中的事件侦听器,并且每当CoreBundle调度事件时,彼此独立的bundle都会注册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
}

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