Переопределить функцию Twig в Symfony - PullRequest
1 голос
/ 23 апреля 2020

Возможно ли и как переопределить функцию Twig, определенную в зависимости?

ThirdPartyCode\HelloExtension определяет hello($string name) функцию Twig, возвращающую Hello, {$name}.

в моем коде , App\MyHelloExtension extends HelloExtension Я хочу переопределить функцию hello($string name), чтобы вернуть Bye, {$name}.

Однако, когда я определяю функцию с тем же именем, используется сторонняя функция, а моя никогда не вызывается. Если я назову его по-другому, например, hello2, он будет работать нормально.

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете полностью заменить существующую функцию, убедившись, что она не будет загружена. Вы можете сделать это, написав CompilerPass, который работает на последнем этапе построения контейнера службы. Этот CompilerPass будет искать сервис по его идентификатору / имени класса, зарегистрирован ли он, а затем удаляет его из контейнера. Это полностью удалит существующее расширение, и вы можете загрузить свое расширение на его место.

См .: https://symfony.com/doc/current/service_container/compiler_passes.html

В качестве альтернативы вы можете использовать logi c из существующего расширения и просто построить поверх него. Для этой службы может подойти украшение, так как украшенные службы заменяют оригинальные, но при этом могут при необходимости получать доступ к базовому украшенному сервису.

services:
    App\MyHelloExtension:
        decorates: ThirdpartyCode\Extension
        arguments:
            - '@App\MyHelloExtension.inner' # this passes the decorated service, i.e. the original extension as an argument, see code snippet below

Это будет гарантировать, что всякий раз, когда что-то извлекает услугу ThirdpartyCode\Extension из контейнера они получат ваше расширение. Это означает, что ваше расширение загружается на свое место. Это особенно хорошо работает, когда ваш код либо расширяет существующее расширение (как видно из фрагментов кода), либо использует такую ​​композицию:


class MyHelloExtension extends TwigExtension
{
    private $originalExtension;

    public function __construct(HelloExtension $helloExtension)
    {
        $this->originalExtension = $helloExtension;
    }

    // ...

    public function hello($name)
    {
        // Your method can still utilize the underlying original method if necessary.
        return $this->originalExtension->hello() . ' ' . $name;
    }
}

См .: https://symfony.com/doc/current/service_container/service_decoration.html

При оформлении услуги вы должны быть осторожны, чтобы в Twig было зарегистрировано только одно из расширений. Вы, вероятно, должны убедиться, что autoconfigure: false установлено на вашем собственном расширении, и что вы не помечаете его как twig.extension.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...