Вы можете полностью заменить существующую функцию, убедившись, что она не будет загружена. Вы можете сделать это, написав 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
.