0

私は現在Test\CoreBundle、自分のWebサイトをオンラインにするための基本的な機能(スプラッシュページや基本的な管理パネルなど)を含めることを目的としています。

私がやりたい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について何も知らないので、これを完全に手に負えないようにするかどうかはわかりません。

4

1 に答える 1

3

CoreBundleで、他のバンドルの「参加」をリッスンするリスナーを作成できます。希望するバンドルのメニュー項目に基づいてナビゲーションを構築するために、以下のようなことを行いました。以下のイベントとイベントリスナーを変更して、必要なデータを渡すことができます。

基本的に、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に認識させたいバンドルの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 に答える