我需要覆盖文件/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中加载此配置文件)。不要忘记将其放在服务密钥下。
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上测试了此方案。
使用内置服务的另一种方法是编译器pass。在编译器传递中,您可以修改整个Symfony服务容器(删除,替换,修改服务)。Symfony与DIC有关。我希望它是足够好的解决方案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句