【问题标题】:ContextErrorException when using Assetic in prod environment在 prod 环境中使用 Assetic 时出现 ContextErrorException
【发布时间】:2015-10-09 01:22:29
【问题描述】:

我对 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 文件,但在打印 &lt;link&gt; 标签之前,HTML 渲染失败并出现异常。

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

[Sun Jul 19 21:21:55.615090 2015] [:error] [pid ] [client X:61902] PHP 致命错误:未捕获的异常 'Symfony\Component\Debug\Exception\ContextErrorException' 带有消息 'Catchable Fatal Error : 传递给 Symfony\Bundle\AsseticBundle\Templating\StaticAsseticHelper::__construct() 的参数 1 必须是 Symfony\Component\Templating\Helper\CoreAssetsHelper 的实例,给定的 Symfony\Bundle\FrameworkBundle\Templating\Helper\AssetsHelper 的实例,称为在 /home/web/public_html/web/app/cache/prod/appProdProjectContainer.php 第 296 行并在 /home/web/public_html/web/vendor/symfony/assetic-bundle/Templating/StaticAsseticHelper.php:33 中定义\n堆栈跟踪:\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, Array)\n#1 /home/web/public_html/web/app/cache/prod/appProdProjectContainer.php(296): Symfony\ Bundle\AsseticBundle\Templating\Sta ticAsseticHelper->__construct(Object(Symfony\Bundle\FrameworkBundle\Templating\ in /home/web/public_html/web/vendor/twig/twig/lib/Twig/Parser.php 370 行

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

【问题讨论】:

  • 你完成app/console cache:clear --env=prod了吗?
  • 是的,我试过了,但同样的问题发生了。

标签: php symfony assetic


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我在 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 服务。 Symfony 3.0 中将删除 templating.helper.assets 服务。

    虽然新类提供了与已弃用类相同的方法,但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 包时,此修复将被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2014-04-17
      • 2023-01-21
      相关资源
      最近更新 更多