我目前有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一无所知,我不知道我是否会完全喋喋不休。
答案 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
}
如果其他人有更简单的方法来实现这一目标,我很想知道一种更简单/更清洁的方式!