gpt4 book ai didi

php - "right"覆盖另一个包中的 symfony 扩展的方法是什么

转载 作者:行者123 更新时间:2023-12-03 01:02:18 25 4
gpt4 key购买 nike

我需要覆盖该文件/vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/Extension/AssetsExtension.php

它使用 twig 函数“asset”从包中加载 twig getAssetUrl

/**
* Returns a list of functions to add to the existing list.
*
* @return array An array of functions
*/
public function getFunctions()
{
return array(
new \Twig_SimpleFunction('asset', array($this, 'getAssetUrl')),
new \Twig_SimpleFunction('assets_version', array($this, 'getAssetsVersion')),
);
}

我想覆盖 asset() twig 函数而不触及核心文件,否则它将被下一个 symfony 更新覆盖

最佳答案

考虑您的代码位于 AppBundle 命名空间中。首先在 app/config.yml 或 src/AppBundle/Resources/config/something.yml 中创建服务配置(您必须在 bundle extension 中加载此配置文件)。不要忘记将其放在 services key 下。

twig.extension.assets:
class: AppBundle\Twig\AssetsExtension
arguments: ["@service_container", "@?router.request_context"]
public: false
tags:
- { name: twig.extension }

现在让我们创建扩展 src/AppBundle/Twig/AssetsExtension.php。该类继承自原始扩展,我将仅重写一个方法(在模板 asset() 中)。

<?php

namespace AppBundle\Twig;

class AssetsExtension extends \Symfony\Bundle\TwigBundle\Extension\AssetsExtension
{
public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null)
{
return parent::getAssetUrl('/something/' . $path, $packageName, $absolute, $version);
}
}

现在,重新加载后,您的所有资源都应该不正确,并且默认以/something/为前缀。如果出现问题,您可以尝试删除 Symfony 缓存。我在 Symfony 2.5.5 上测试了这个场景。

使用内置服务的另一种方法是 compiler pass 。在编译过程中,您可以修改整个 Symfony 服务容器(删除、替换、修改服务)。 Symfony 就是关于 DIC 的。我希望这是足够好的解决方案。

关于php - "right"覆盖另一个包中的 symfony 扩展的方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com