ContextErrorException при использовании Assetic в среде prod

У меня проблема с Symfony 2.

Я получаю CSS в разделе head следующим образом:

<?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> тег.

В моем журнале я вижу это, но я не понимаю ошибку.

[Вс 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 и определено в /home/web/public_html/web/vendor/symfony/assetic-bundle/Templating/StaticAsseticHelper.php: trace.exe : \ n # 0 /home/web/public_html/web/vendor/symfony/assetic-bundle/Templating/StaticAsseticHelper.php(33): Symfony \ Component \ Debug \ ErrorHandler-> handleError (4096, аргумент 1 проход .. . ‘,’ / home / web / …. ‘, 33, Array) \ n # 1 /home/web/public_html/web/app/cache/prod/appProdProjectContainer.php(296): Symfony \ Bundle \ AsseticBundle \ шаблонирование \ Static AsseticHelper -> __ construct (Object (Symfony \ Bundle \ FrameworkBundle \ Templating \ in /home/web/public_html/web/vendor/twig/twig/lib/Twig/Parser.php в строке 370

Я пытался очистить кеш, но это ничего не меняет.

2

Решение

Я столкнулся с той же проблемой на Symfony 2.7, поэтому я предполагаю, что это версия, которую вы используете.

Проблема в том, что пакет Assetic создает помощника для обслуживания активов. Этот помощник требует Symfony\Component\Templating\Helper\CoreAssetsHelper экземпляр в своем конструкторе: https://github.com/symfony/AsseticBundle/blob/master/Templating/StaticAsseticHelper.php#L33

До сих пор это работало нормально, поскольку это был класс, который был зарегистрирован для службы, внедренной в конструктор. Однако в Symfony 2.7 этот сервис был реорганизован. Обновление заметок для 2.7 читать:

Шаблон templating.helper.assets был реорганизован и теперь возвращает объект типа Symfony \ Bundle \ FrameworkBundle \ Templating \ Helper \ AssetsHelper вместо Symfony \ Component \ Templating \ Helper \ CoreAssetsHelper. Вы можете обновить определение класса или использовать вместо него службу assets.packages. Рекомендуется использовать сервис assets.packages. Служба templating.helper.assets будет удалена в Symfony 3.0.

В то время как новый класс предоставляет те же методы, что и устаревший, конструктор StaticAsseticHelper У класса есть подсказка типа для устаревшего класса. Это приводит к сообщению об ошибке, которое вы видите.

ИМХО это разрыв обратной совместимости для Symfony 2.7 и у меня подал отчет об ошибке с командой Symfony. Тем временем, однако, это было исправлено в 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)

и проблема будет решена на данный момент. Однако это исправление будет перезаписано при следующем обновлении пакета Assetic с помощью Composer.

1

Другие решения

Вы пытались изменить пути активов? Прочитайте эту документацию для деталей. Вам нужно написать пути, как bundles/AppBundle/...,

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector