Symfony Flex:重写Twig的路由路径功能

问题描述 投票:0回答:3

在 Symfony2 中,重写 RoutingExtension 非常简单,我可以注入一些额外的参数。

我正在使用动态域路由到应用程序的不同部分。

{subdomain}.domain.com

但是,我不想每次在 twig 中调用路径或 url 时都必须指定子域。

我可以创建自己独特的过滤器名称,但我不愿意。

以前,我们可以将其放入 services.yaml 文件中,这样就可以工作了。

services:
    twig.extension.routing:
        class: AppBundle\Twig\Extension\RoutingExtension
        public: false
        arguments:
          - '@router'
          - '@request_stack'
          - '%domain%'

Symfony2 Twig 覆盖默认路径功能

使用 Symfony Flex,我得到的只是

Unable to register extension "App\TwigExtension\TwigRoutingExtension" as it is already registered.

symfony symfony4
3个回答
2
投票

这是如何使用 AbstractExtension 在 Symfony 5.x 中覆盖 Twig 的路由路径/url 函数:

namespace App\Twig;

use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class MyRoutingExtension extends AbstractExtension
{
    public function __construct(
        private UrlGeneratorInterface $generator
    ){}

    public function getFunctions(): array
    {
        return [
            new TwigFunction('path', [$this, 'getPath']),
            new TwigFunction('url', [$this, 'getUrl']),
        ];
    }

    public function getPath(string $name, array $parameters = [], bool $relative = false): string
    {
        return $this->generator->generate($name, $parameters, $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH);
    }

    public function getUrl(string $name, array $parameters = [], bool $schemeRelative = false): string
    {

        return $this->generator->generate($name, $parameters, $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL);
    }
}

1
投票

在 SF4 中更简单:

第一

composer require symfony/twig-bundle twig/extensions

通常会启用自动装配,因此您只需执行以下操作:

<?php

namespace App\Twig;

use Symfony\Bridge\Twig\Extension\RoutingExtension;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class TestExtension extends RoutingExtension
{
    public function __construct(UrlGeneratorInterface $generator)
    {
        parent::__construct($generator);
    }

    public function getPath($name, $parameters = array(), $relative = false)
    {
        return parent::getPath($name, $parameters, $relative);
    }
}

如果你想设置一个服务,忘记参数定义,这很无聊:)。假设您的

%domain%
在您的参数中可用,请执行以下操作:

<?php

namespace App\Twig;

use Symfony\Bridge\Twig\Extension\RoutingExtension;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;

class TestExtension extends RoutingExtension
{
    /** @var RouterInterface $router */
    protected $router;

    /** @var RequestStack $stack */
    protected $stack;

    /** @var mixed $domain */
    protected $domain;

    /**
     * TestExtension constructor.
     *
     * @param RouterInterface       $router
     * @param RequestStack          $stack
     * @param ParameterBagInterface $bag
     */
    public function __construct(RouterInterface $router, RequestStack $stack, ParameterBagInterface $bag)
    {
        $this->router = $router;
        $this->stack  = $stack;
        $this->domain = $bag->get('domain');
    }


    public function getPath($name, $parameters = array(), $relative = false)
    {
        return parent::getPath($name, $parameters, $relative);
    }
}

0
投票

我尝试使用那里的答案:https://stackoverflow.com/a/72365709/2356946机智SF4项目,但它不是覆盖函数。 我尝试清除缓存,但没有任何反应。

知道为什么这些函数的行为没有被覆盖吗?

© www.soinside.com 2019 - 2024. All rights reserved.