在prod环境中使用Assetic时出现ContextErrorException

时间:2015-07-20 01:29:49

标签: php symfony assetic

我遇到Symfony 2的问题。

我在头部获得了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致命错误:未捕获异常&#39; Symfony \ Component \ Debug \ Exception \ ContextErrorException&#39;消息&#39; Catchable Fatal Error:传递给Symfony \ Bundle \ AsseticBundle \ Templating \ StaticAsseticHelper :: __ construct()的参数1必须是Symfony \ Component \ Templating \ Helper \ CoreAssetsHelper的实例,Symfony \ Bundle \ FrameworkBundle的实例给出了Templating \ Helper \ AssetsHelper,在第296行的/home/web/public_html/web/app/cache/prod/appProdProjectContainer.php中调用并定义了&#39;在/home/web/public_html/web/vendor/symfony/assetic-bundle/Templating/StaticAsseticHelper.php:33 \ nStack trace:\ n#0 / home / web / public_html / web / vendor / symfony / assetic-bundle / Templating / StaticAsseticHelper.php(33):Symfony \ Component \ Debug \ ErrorHandler-&gt; handleError(4096,&#39; Argument 1 pass ...&#39;,&#39; / home / web / ... 。&#39;,33,数组)\ n#1 /home/web/public_html/web/app/cache/prod/appProdProjectContainer.php(296):Symfony \ Bundle \ AsseticBundle \ Templating \ StaticAsseticHelper-&gt; __ construct(对象(第370行的Symfony \ Bundle \ FrameworkBundle \ Templating \ in /home/web/public_html/web/vendor/twig/twig/lib/Twig/Parser.php

我已尝试清除缓存,但这并没有改变任何内容。

2 个答案:

答案 0 :(得分:1)

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

问题是Assetic捆绑包创建了一个帮助者来提供资产。此帮助程序在其构造函数中需要Symfony\Component\Templating\Helper\CoreAssetsHelper实例:https://github.com/symfony/AsseticBundle/blob/master/Templating/StaticAsseticHelper.php#L33

到目前为止,这工作正常,因为这是注册到构造函数中的服务的类。但是,使用Symfony 2.7,这项服务被重构了。 upgrade notes for 2.7读到:

  

templating.helper.assets已重构,现在返回Symfony \ Bundle \ FrameworkBundle \ Templating \ Helper \ AssetsHelper类型的对象,而不是Symfony \ Component \ Templating \ Helper \ CoreAssetsHelper。您可以更新类定义或使用assets.packages服务。建议使用assets.packages服务。 templation.helper.assets服务将在Symfony 3.0中删除。

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

恕我直言,这是Symfony 2.7的向后兼容性中断,我与Symfony团队有filed a bug report。然而,与此同时,这已在AsseticBundle中修复,并将其升级到最新版本应该可以解决问题。

解决方法

如果由于某种原因,您可以不升级AsseticBundle,以下是暂时修复它的方法。

如上所述,问题在于StaticAsseticHelper构造函数上的类型提示。所以我们将改变它以使用新类型,我们很高兴。

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

更改第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更新Assetic包时,此修复程序将被覆盖。

答案 1 :(得分:0)

您是否尝试更改资产路径? Read this documentation for details。您需要像bundles/AppBundle/...这样的写路径。