symfony - Symfony 和 Encore 在页面中打印关键路径的 css
问题描述
是否可以在页面中打印 css 而不是生成链接标签{{ encore_entry_link_tags('app') }}
?或者是否有其他解决方案来整合关键路径?
解决方案
由于声誉低,我无法添加评论,但是看看symfonycasts 有完整的解决方案。
基本上你应该解析entrypoints.json文件,找到你需要的合适的 css 文件。你可以使用EntrypointLookupInterface
它。然后获取该文件的内容并通过漂亮的自己的 twig 扩展将其返回到模板。
class AppExtension extends AbstractExtension implements ServiceSubscriberInterface
{
private $publicDir;
public function __construct(ContainerInterface $container, string $publicDir)
{
$this->publicDir = $publicDir;
}
public function getFunctions(): array
{
return [
new TwigFunction('encore_entry_css_source', [$this, 'getEncoreEntryCssSource']),
];
}
public function getEncoreEntryCssSource(string $entryName): string
{
$files = $this->container
->get(EntrypointLookupInterface::class)
->getCssFiles($entryName);
$source = '';
foreach ($files as $file) {
$source .= file_get_contents($this->publicDir.'/'.$file);
}
return $source;
}
public static function getSubscribedServices()
{
return [
EntrypointLookupInterface::class,
];
}
}
您还必须将 publicDir 添加到您的config/services.yaml
文件中
services:
_defaults:
bind:
string $publicDir: '%kernel.project_dir%/public'
然后在树枝模板中
{% apply inky_to_html|inline_css(encore_entry_css_source('email')) %}
{% endapply %}
推荐阅读
- django - 在一个查询中通过唯一的非主键字段分配外键
- angular - 在子组件属性中更改 @Input() 会阻止父组件的进一步更新
- jquery - selectize.js 多下拉输入位置
- python - 在 python 中处理大型请求响应(JSON 对象数组)
- r - 如何对每组数据框应用函数
- admob - 删除后如何添加admob付款方式?
- arrays - 将 JSON 转换为 Twig 循环数组
- javascript - rel="preload" 如何影响 window.onload?
- php - 如何从现代事件日历插件中获取元数据
- xml - 在 Android Studio 中从图库中将图像片段加载和存储到 SQLite 数据库