用 Symfony2 重载一个包

Overload a bundle with Symfony2

所以,我全新安装 Symfony 2.7.9 的问题是 SonataUserBundle 没有更新它们的依赖关系,我被一个有问题的包困住了(我已经尝试升级到更高版本但没有成功)。

这是错误:

Attempted to call an undefined method named "setCurrentUri" of class "Knp\Menu\MenuItem".Did you mean to call "setCurrent"?

在第 91 行 Sonata/Userbundle/Block/ProfileMenuBlockService.php 中抛出的

$menu->setCurrentUri($settings['current_uri']);

因此,我想在我的 Application/Sonata/UserBundle 中重载此文件,但我不明白为什么它不起作用。

这是我所做的:

我在Application/Sonata/UserBundle/Block/

下复制了负责的文件
<?php
namespace Application\Sonata\UserBundle\Block;

use Knp\Menu\ItemInterface;
use Knp\Menu\Provider\MenuProviderInterface;
use Sonata\AdminBundle\Validator\ErrorElement;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\BlockBundle\Block\Service\MenuBlockService;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\UserBundle\Menu\ProfileMenuBuilder;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * Class ProfileMenuBlockService
 *
 * @package Sonata\UserBundle\Block
 *
 * @author Hugo Briand <briand@ekino.com>
 */
class ProfileMenuBlockService extends MenuBlockService
{
    /**
     * @var ProfileMenuBuilder
     */
    private $menuBuilder;

    /**
     * Constructor
     *
     * @param string                $name
     * @param EngineInterface       $templating
     * @param MenuProviderInterface $menuProvider
     * @param ProfileMenuBuilder    $menuBuilder
     */
    public function __construct($name, EngineInterface $templating, MenuProviderInterface $menuProvider, ProfileMenuBuilder $menuBuilder)
    {
        parent::__construct($name, $templating, $menuProvider, array());

        $this->menuBuilder = $menuBuilder;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'User Profile Menu';
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultSettings(OptionsResolverInterface $resolver)
    {
        parent::setDefaultSettings($resolver);

        $resolver->setDefaults(array(
            'cache_policy' => 'private',
            'menu_template' => "SonataBlockBundle:Block:block_side_menu_template.html.twig",
        ));
    }

    /**
     * {@inheritdoc}
     */
    protected function getMenu(BlockContextInterface $blockContext)
    {
        $settings = $blockContext->getSettings();

        $menu = parent::getMenu($blockContext);

        if (null === $menu || "" === $menu) {
            $menu = $this->menuBuilder->createProfileMenu(
                array(
                    'childrenAttributes' => array('class' => $settings['menu_class']),
                    'attributes'         => array('class' => $settings['children_class']),
                )
            );
            $menu->setCurrent($settings['current_uri']); // The corrected line
        }

        return $menu;
    }
}

因为不行,我也重载了配置文件Sonata/UserBundle/Resources/config/block。xml :

<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="sonata.user.block.menu" class="Application\Sonata\UserBundle\Block\ProfileMenuBlockService">
            <tag name="sonata.block" />
            <argument>sonata.user.block.menu</argument>
            <argument type="service" id="templating" />
            <argument type="service" id="knp_menu.menu_provider" />
            <argument type="service" id="sonata.user.profile.menu_builder" />
        </service>

        <service id="sonata.user.block.account" class="Sonata\UserBundle\Block\AccountBlockService">
            <tag name="sonata.block" />
            <argument>sonata.user.block.account</argument>
            <argument type="service" id="templating" />
            <argument type="service" id="security.context" />
        </service>
    </services>

</container>

你看到我遗漏了什么吗?

更何况我已经清除了缓存,甚至重新启动了我的电脑。

提前致谢。

根据pavlovich的建议,我又试了一次this solution,之前失败了,又失败了。然后,我注意到正确答案的评论并尝试了它:它失败了,因为我已经在使用 sonata-project/user-bundle 2.2.5。然后我使用了以下命令:

composer require composer require knplabs/knp-menu ~1.1 knplabs/knp-menu-bundle ~1.1 sonata-project/user-bundle 2.2.4

这行得通,但我遇到了另一个错误,缺少奏鸣曲服务的依赖项。因此,我回滚到 sonata-project/user-bundle 2.2.5,它没有更新 knplabs/*-bundle 版本。

令我惊讶的是,它实际上解决了我的问题。