在prod环境中使用astic时出现contextroreexception


ContextErrorException when using Assetic in prod environment

我有一个Symfony 2的问题。

head部分的CSS是这样的:

<?php foreach ($view['assetic']->stylesheets(
    array(
        '../web/assets/css/bootstrap.min.css',
        '../web/assets/css/main.css',
    ),array('cssrewrite')
) as $url): ?>
    <link rel="stylesheet" href="<?php echo $view->escape($url) ?>" />
<?php endforeach ?>

在开发环境中,一切正常。在prod环境中,CSS文件生成了,但是在打印<link>标记之前,HTML呈现失败并出现异常。

在我的日志中我看到了这个,但是我不明白这个错误。

[Sun Jul 19 21:21:55.615090 2015] [:error] [pid] [client X:61902] PHP致命错误:Uncaught exception 'Symfony'Component'Debug' exception ' contextroreexception ' with message 'Catchable Fatal error:参数1传递给Symfony'Bundle'AsseticBundle' template 'StaticAsseticHelper::__construct()必须是Symfony'Component' template 'Helper'CoreAssetsHelper的实例,Symfony'Bundle'FrameworkBundle' template 'Helper'AssetsHelper的实例给定,在/home/web/public_html/web/app/cache/prod/appProdProjectContainer.php中调用296行并定义'在/home/web/public_html/web/vendor/symfony/资产-bundle/Templating/StaticAsseticHelper.php:33'nStack trace:'n#0/home/web/public_html/web/vendor/symfony/资产-bundle/Templating/StaticAsseticHelper.php(33): symfony 'Component'Debug'ErrorHandler->handleError(4096, '参数1 pass…"、"/home/web/……', 33, Array)'n#1/home/web/public_html/web/app/cache/prod/appProdProjectContainer.php(296): Symfony'Bundle'AsseticBundle'Templating'StaticAsseticHelper->__construct(Object(Symfony'Bundle'FrameworkBundle'Templating' in/home/web/public_html/web/vendor/twig/twig/lib/twig/Parser.php on line 370

我已经尝试清除缓存,但这并没有改变任何东西。

我在Symfony 2.7上遇到了同样的问题,所以我假设这是你正在使用的版本。

问题是,Assetic bundle创建了一个帮助器来服务资产。这个帮助器需要在它的构造函数中有一个Symfony'Component'Templating'Helper'CoreAssetsHelper实例:https://github.com/symfony/AsseticBundle/blob/master/Templating/StaticAsseticHelper.php#L33

到目前为止,这工作得很好,因为这是为注入构造函数的服务注册的类。然而,在Symfony 2.7中,这个服务被重构了。2.7版本的升级说明如下:

template . Helper. assets被重构,现在返回类型为Symfony'Bundle'FrameworkBundle' template 'Helper'AssetsHelper的对象,而不是Symfony'Component' template 'Helper' coressetshelper。您可以更新类定义或使用资产。包服务代替。使用资产。包服务是推荐的方式。在Symfony 3.0中将删除template .helper.assets服务。

虽然新类提供了与已弃用的类相同的方法,但StaticAsseticHelper类的构造函数对已弃用的类有类型提示。这会导致您看到的错误消息。

恕我直言,这是Symfony 2.7的向后兼容性中断,我已经向Symfony团队提交了一个错误报告。不过,与此同时,这个问题已经在AsseticBundle中得到了修复,升级到最新版本应该可以解决这个问题。

解决方案

如果你可以,出于某种原因,不升级AsseticBundle,这里是如何临时修复它。

如上所述,问题在于StaticAsseticHelper构造函数上的类型提示。因此,我们将它改为使用新的类型,我们就可以开始了。

找到vendor目录下的symfony/assetic-bundle/Templating/StaticAsseticHelper.php文件

更改第17行
use Symfony'Component'Templating'Helper'CoreAssetsHelper;

use Symfony'Bundle'FrameworkBundle'Templating'Helper'AssetsHelper;

和从

更改第33行
public function __construct(CoreAssetsHelper $assetsHelper, AssetFactory $factory)

public function __construct(AssetsHelper $assetsHelper, AssetFactory $factory)

,这个问题将被修复。但是,当您下次通过composer更新您的资产包时,此修复将被覆盖。

您是否尝试更改资源路径?详细信息请阅读本文档。您需要像bundles/AppBundle/...这样的写入路径。

相关文章:
  • 没有找到相关文章