首页 文章

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

提问于
浏览
2

我有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文件,但HTML呈现在打印 <link> 标记之前失败并出现异常 .

在我的日志中,我看到了这一点,但我不明白错误 .

[Sun Jul 19 21:21:55.615090 2015] [:error] [pid] [client X:61902] PHP致命错误:未捕获异常'Symfony \ Component \ Debug \ Exception \ ContextErrorException',消息'Catchable Fatal Error:Argument 1传递给Symfony \ Bundle \ AsseticBundle \ Templating \ StaticAsseticHelper :: __ construct()必须是Symfony \ Component \ Templating \ Helper \ CoreAssetsHelper的实例,Symfony \ Bundle \ FrameworkBundle \ Templating \ Helper \ AssetsHelper的实例,在/中调用home / web / public_html / web / app / cache / prod / appProdProjectContainer.php 296行并定义'in /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-> handleError(4096,'Argument 1 pass . ..','/ home / web / ....',33,数组)\ n#1 /home/web/public_html/web/app/cache/prod/appProdProjectContainer.php(296):Symfony \ Bundle \ AsseticBundle \模板\为static cAsseticHelper - > __ construct(对象(Symfony \ Bundle \ FrameworkBundle \ Templating \ in /home/web/public_html/web/vendor/twig/twig/lib/Twig/Parser.php,370行

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

2 回答

  • 0

    我在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 构造函数上的类型提示 . 所以我们将改变它以使用新类型,我们很高兴 .

    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更新Assetic包时,将修改此修复程序 .

  • 1

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

相关问题