0

我需要一些帮助,或者更确切地说是一些建议。

我有一个包含一些通用功能的核心包和几个具有更具体功能的附加包。

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

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

我的 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 类,它遍历已注册的包并调用接口方法:

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);
            }
        }
    }

    ...

}

我还试图想象我想要什么结构:

在此处输入图像描述

任何有关实现此结构的更好实践的提示将不胜感激。

4

0 回答 0