2016-03-02 3 views
2

поэтому я решил использовать KnpMenuBundle в своем проекте Symfony, но для того, чтобы меню работало так, как я собираюсь, я добавил 2 строки в /vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php.Как зарегистрировать пользовательский избиратель в Symfony KNP Menu Bundle?

Поэтому я знаю, что неправильная практика заключается в изменении содержимого папки поставщика. Мой вопрос: как мне применить эти изменения? Я предполагаю, что мне нужно создать свой собственный класс Voter, расширить RouteVoter и зарегистрировать его с помощью Symfony. Нигде в Интернете я не мог найти, как это сделать.

Любые идеи? Спасибо, Майк.

ответ

6

Чтобы зарегистрировать пользовательский избиратель, вы должны создать customVoter в своем проекте и зарегистрировать его как услугу.

Ваш избиратель должен выглядеть как этот

class RegexVoter implements VoterInterface 
{ 
    /** 
    * @var RequestStack 
    */ 
    private $requestStack; 

    /** 
    * @param RequestStack $requestStack 
    */ 
    public function __construct(RequestStack $requestStack) 
    { 
     $this->requestStack = $requestStack; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function matchItem(ItemInterface $item) 
    { 
     $childRegex = $item->getExtra('regex'); 

     if ($childRegex !== null && preg_match($childRegex, $this->requestStack->getCurrentRequest()->getPathInfo())) { 
      return true; 
     } 

     return; 
    } 
} 

Зарегистрируйте как сервис, как этот

menu.voter.regex: 
    class: AppBundle\Menu\Matcher\Voter\RegexVoter 
    arguments: [ '@request_stack' ] 
    tags: 
     - { name: knp_menu.voter } 

Затем вы должны создать экземпляр избирателю в вашем menuBuilder

private $regexVoter; 

public function __construct(RegexVoter $regexVoter) 
{ 
    $this->regexVoter = $regexVoter; 
} 

В мой пример, мой избиратель получает предмет дополнительно regex для работы.

Я думаю, вы должны изменить и использовать свою собственную логику.

Я надеюсь, что это поможет вам

+0

Я думаю, что если вы используете ESI, вы должны использовать это регулярное выражение: 'preg_match ($ itemRegex, $ this-> requestStack-> getMasterRequest() -> getPathInfo())' – Bruno