2016-07-20 2 views
2

Итак, проблема с моей новой установкой Symfony 2.7.9 заключается в том, что SonataUserBundle не обновлял свои зависимости, и я застрял в комплекте с ошибкой (я уже пытался обновить до большей версии без успех).Перегрузка пакета с помощью Symfony2

Вот ошибка:

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

Что брошено в Sonata/Userbundle/Block/ProfileMenuBlockService.php в строке 91

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

Поэтому я хочу перегружать этот файл в моем приложении/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 <[email protected]> 
*/ 
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> 

Вы видите что-то, что мне не хватает?

Не говоря уже о том, что я уже очистил кеш и даже перезагрузил свой компьютер.

Спасибо заранее.

+0

Пожалуйста, ознакомьтесь со статьей http://stackoverflow.com/questions/25188768/call-to-method-setcurrenturi-fails-in-symfony-sonataerer-undus-setup и сообщите нам, если она сработала;) – pavlovich

+0

Я уже пробовал это и это не работает. – systemasis

ответ

2

После того, как предложение 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 

который работал, но я получил другую ошибку с отсутствующей зависимостью для службы сонаты. Поэтому я вернулся к сонате-проекту/пользовательскому набору 2.2.5, который не обновлял версии knplabs/* - bundle.

К моему собственному удивлению, это фактически решило мою проблему.

Смежные вопросы