2016-03-02 62 views
2

所以我決定在我的Symfony項目中使用KnpMenuBundle,但爲了讓菜單按照我的意圖工作,我在/vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php中添加了2行。如何在Symfony KNP菜單包中註冊自定義選民?

所以我知道改變供應商文件夾的內容是一種不好的做法。我的問題是,如何應用這些更改?我猜我必須創建自己的選民類,擴展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,$這個 - > requestStack-> getMasterRequest() - > getPathInfo())' – Bruno