使用bundle类来扩展CoreBundle

时间:2015-03-17 00:46:17

标签: symfony bundles

我需要一些帮助或者一些建议。

我有一个包含一些常规功能的核心软件包以及一些具有更多特定功能的附加软件包。

例如,我的核心软件包负责为我的应用程序呈现主菜单,但我希望其他软件包只能通过注册软件包来添加菜单项。 (最后这些菜单项将是可用的菜单项,不一定是实际活动的菜单项。)

我有一个解决方案,但我不确定它是否是一个好的。

我的CoreBundle还包含一个CoreBundleInterface:

namespace CoreBundle;

use CoreBundle\Menu\MenuBuilder;

interface CoreBundleInterface
{
    public function getMenuItems(MenuBuilder $menuItem);
}

所以任何其他bundle都可以实现这个接口:

namespace AddressBundle;

use CoreBundle\CoreBundleInterface;
use CoreBundle\Menu\MenuBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class AddressBundle extends Bundle implements CoreBundleInterface
{
    public function getMenuItems(MenuBuilder $menuBuilder)
    {
        $menuBuilder->addItem(['name' => 'addresses', 'label' => 'Addresses']);
    }
}

我的CoreBundle有一个MenuBuilder类,它遍历注册的bundle并调用接口方法:

namespace CoreBundle\Menu;

use CoreBundle\CoreBundleInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class MenuBuilder
{
    private $items;

    public function __construct(ContainerInterface $container)
    {
        $this->addItem(['name' => 'home', 'label' => 'Home']);

        $bundles = $container->get('kernel')->getBundles();
        foreach ($bundles as $bundle) {
            if (is_callable(array($bundle, 'getMenuItems')) && $bundle instanceof CoreBundleInterface) {
                call_user_func(array($bundle, 'getMenuItems'), $this);
            }
        }
    }

    ...

}

我还试图想象出我想要的结构:

enter image description here

非常感谢任何提示实现这种结构的更好的做法。

0 个答案:

没有答案