LiquidRenderer.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace App\Services;
  3. use Illuminate\Support\Facades\Cache;
  4. use App\Http\Controllers\ProductController;
  5. use App\Services\LiquidTags\LiquidTagProduct;
  6. use App\Services\LiquidTags\LiquidTagVideo;
  7. use App\Services\LiquidTags\LiquidTagBanner;
  8. use App\Services\LiquidTags\LiquidTagContactUs;
  9. use Liquid\Liquid;
  10. use Liquid\Template;
  11. use Liquid\Cache\File as FileCache;
  12. use App\Services\LiquidTags\LiquidTagPage; // 添加对自定义标签的引用
  13. use App\Services\LiquidFilters\Filters;
  14. use App\Helpers\SiteCache;
  15. class LiquidRenderer
  16. {
  17. protected static ?string $baseTemplatePath = null;
  18. // 渲染 Liquid 模板
  19. public static function render(string $templateName, array $data = [],?string $cacheKey = null): string
  20. {
  21. self::initializeLiquidSettings();
  22. self::initializeBaseTemplatePath();
  23. // 如果提供了缓存键,则检查和设置缓存
  24. if ($cacheKey) {
  25. $cacheDuration = config('liquid.cache_duration', 300); // 默认缓存时间为 300 秒
  26. // 检查缓存是否存在
  27. $domain=app('dist')->domain;
  28. if(!$domain)
  29. {
  30. abort('403');
  31. }
  32. return Cache::tags([$domain, 'dist'])->remember("liquid_{$cacheKey}", $cacheDuration, function () use ($templateName, $data) {
  33. return self::processTemplate($templateName, $data);
  34. });
  35. }
  36. // 如果没有提供缓存键,直接渲染模板
  37. return self::processTemplate($templateName, $data);
  38. // $template = self::createTemplateInstance();
  39. //
  40. // $template->registerTag('page', LiquidTagPage::class);
  41. // $template->registerTag('product', LiquidTagProduct::class);
  42. // $template->registerTag('video', LiquidTagVideo::class);
  43. // $template->registerTag('contact', LiquidTagContactUs::class);
  44. // $template->registerTag('banner', LiquidTagBanner::class);
  45. // $template->registerTag('contactus', LiquidTagContactUs::class);
  46. // $template->registerFilter(Filters::class);
  47. //
  48. //
  49. // //获取全局配置,合并到当前配置
  50. // $config = self::getGlobalConfig();
  51. // $data['site'] = array_merge($data['site'] ?? [], $config);
  52. //
  53. //
  54. // try {
  55. // $parsedTemplate = $template->parseFile($templateName);
  56. // } catch (\Exception $e) {
  57. // throw new \RuntimeException("Template not found: {$templateName}", 0, $e);
  58. // }
  59. //
  60. // return $parsedTemplate->render($data);
  61. }
  62. // 处理模板渲染逻辑
  63. private static function processTemplate(string $templateName, array $data): string
  64. {
  65. $template = self::createTemplateInstance();
  66. $template->registerTag('page', LiquidTagPage::class);
  67. $template->registerTag('product', LiquidTagProduct::class);
  68. $template->registerTag('video', LiquidTagVideo::class);
  69. $template->registerTag('contact', LiquidTagContactUs::class);
  70. $template->registerTag('banner', LiquidTagBanner::class);
  71. $template->registerTag('contactus', LiquidTagContactUs::class);
  72. $template->registerFilter(Filters::class);
  73. // 获取全局配置,合并到当前配置
  74. $config = self::getGlobalConfig();
  75. $data['site'] = array_merge($data['site'] ?? [], $config);
  76. try {
  77. $parsedTemplate = $template->parseFile($templateName);
  78. } catch (\Exception $e) {
  79. throw new \RuntimeException("Template not found: {$templateName}", 0, $e);
  80. }
  81. $now_string=date('Y-m-d H:i:s');
  82. return $parsedTemplate->render($data);//."<!-- CACHE {$now_string}-->";
  83. }
  84. // 初始化基础模板路径
  85. private static function initializeBaseTemplatePath(): void
  86. {
  87. // 获取分销
  88. $dist=app('dist');
  89. // 使用默认值的函数封装,避免重复逻辑
  90. $template_dist_id = $dist->id ?? trim(config('liquid.template_dist_id'));
  91. $template_name = $dist->template_name ?? trim(config('liquid.template_name'));
  92. if (self::$baseTemplatePath === null) {
  93. self::$baseTemplatePath = rtrim(config('liquid.template_path'), '/') . '/' .
  94. trim($template_dist_id). '/' .
  95. ltrim($template_name, '/');
  96. }
  97. }
  98. // 创建模板实例
  99. private static function createTemplateInstance(): Template
  100. {
  101. $template = new Template(self::$baseTemplatePath);
  102. // 检查配置文件是否启用缓存
  103. $enableCache = config('liquid.cache_enabled', false); // 默认不开启缓存
  104. if ($enableCache) {
  105. $template->setCache(new FileCache(['cache_dir' => storage_path('framework/cache/data')]));
  106. }
  107. return $template;
  108. }
  109. public static function getBaseTemplatePath(): string
  110. {
  111. // 确保路径已经初始化
  112. if (self::$baseTemplatePath === null) {
  113. self::initializeBaseTemplatePath();
  114. }
  115. return self::$baseTemplatePath;
  116. }
  117. // 设置 Liquid 渲染的全局配置
  118. private static function initializeLiquidSettings(): void
  119. {
  120. Liquid::set('INCLUDE_SUFFIX', '');
  121. Liquid::set('INCLUDE_PREFIX', '');
  122. Liquid::set('INCLUDE_ALLOW_EXT', true);
  123. Liquid::set('ESCAPE_BY_DEFAULT', true);
  124. }
  125. /**
  126. * 获取全局配置
  127. */
  128. private static function getGlobalConfig(): array
  129. {
  130. return [
  131. 'site_title' => config('app.name'),
  132. 'image_base_url' => config('liquid.image_base_url'),
  133. 'asset_base_url' =>config('liquid.asset_base_url'),
  134. 'font_base_url' => config('liquid.font_base_url'),
  135. 'dist' => app('dist'),
  136. 'menus_header'=>app('menus_header'),
  137. 'menus_footer'=>app('menus_footer'),
  138. ];
  139. }
  140. }