2

所以我决定在我的 Symfony 项目中使用 KnpMenuBundle,但是为了让菜单按我的意图工作,我在 /vendor/knplabs/knp-menu/src/Knp/Menu/Matcher/Voter/RouteVoter.php.

所以我知道更改供应商文件夹的内容是一种不好的做法。我的问题是,如何应用这些更改?我猜我必须创建自己的 Voter 类,扩展 RouteVoter 并以某种方式将其注册到 Symfony。在互联网上没有任何地方可以找到如何做到这一点。

有任何想法吗?谢谢,迈克。

4

1 回答 1

7

要注册自定义投票者,您必须在项目中创建 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工作。

我认为您必须修改和使用自己的逻辑。

我希望这能帮到您

于 2016-03-02T14:18:22.767 回答