LiquidRenderer.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Services;
  3. use App\Services\LiquidTags\LiquidTagProduct;
  4. use App\Services\LiquidTags\LiquidTagVideo;
  5. use App\Services\LiquidTags\LiquidTagBanner;
  6. use App\Services\LiquidTags\LiquidTagContactUs;
  7. use Liquid\Liquid;
  8. use Liquid\Template;
  9. use Liquid\Cache\File as FileCache;
  10. use App\Services\LiquidTags\LiquidTagPage; // 添加对自定义标签的引用
  11. use App\Services\LiquidFilters\Filters;
  12. use App\Helpers\SiteCache;
  13. class LiquidRenderer
  14. {
  15. protected static ?string $baseTemplatePath = null;
  16. // 渲染 Liquid 模板
  17. public static function render(string $templateName, array $data = []): string
  18. {
  19. self::initializeLiquidSettings();
  20. self::initializeBaseTemplatePath();
  21. $template = self::createTemplateInstance();
  22. $template->registerTag('page', LiquidTagPage::class);
  23. $template->registerTag('product', LiquidTagProduct::class);
  24. $template->registerTag('video', LiquidTagVideo::class);
  25. $template->registerTag('contact', LiquidTagContactUs::class);
  26. $template->registerTag('banner', LiquidTagBanner::class);
  27. $template->registerTag('contactus', LiquidTagContactUs::class);
  28. $template->registerFilter(Filters::class);
  29. //获取全局配置,合并到当前配置
  30. $config = self::getGlobalConfig();
  31. $data['site'] = array_merge($data['site'] ?? [], $config);
  32. try {
  33. $parsedTemplate = $template->parseFile($templateName);
  34. } catch (\Exception $e) {
  35. throw new \RuntimeException("Template not found: {$templateName}", 0, $e);
  36. }
  37. return $parsedTemplate->render($data);
  38. }
  39. // 初始化基础模板路径
  40. private static function initializeBaseTemplatePath(): void
  41. {
  42. // 获取分销
  43. $dist=app('dist');
  44. // 使用默认值的函数封装,避免重复逻辑
  45. $template_dist_id = $dist->id ?? trim(config('liquid.template_dist_id'));
  46. $template_name = $dist->template_name ?? trim(config('liquid.template_name'));
  47. if (self::$baseTemplatePath === null) {
  48. self::$baseTemplatePath = rtrim(config('liquid.template_path'), '/') . '/' .
  49. trim($template_dist_id). '/' .
  50. ltrim($template_name, '/');
  51. }
  52. }
  53. // 创建模板实例
  54. private static function createTemplateInstance(): Template
  55. {
  56. $template = new Template(self::$baseTemplatePath);
  57. //$template->setCache(new FileCache(['cache_dir' => storage_path('framework/cache/data')]));
  58. return $template;
  59. }
  60. public static function getBaseTemplatePath(): string
  61. {
  62. // 确保路径已经初始化
  63. if (self::$baseTemplatePath === null) {
  64. self::initializeBaseTemplatePath();
  65. }
  66. return self::$baseTemplatePath;
  67. }
  68. // 设置 Liquid 渲染的全局配置
  69. private static function initializeLiquidSettings(): void
  70. {
  71. Liquid::set('INCLUDE_SUFFIX', '');
  72. Liquid::set('INCLUDE_PREFIX', '');
  73. Liquid::set('INCLUDE_ALLOW_EXT', true);
  74. Liquid::set('ESCAPE_BY_DEFAULT', true);
  75. }
  76. /**
  77. * 获取全局配置
  78. */
  79. private static function getGlobalConfig(): array
  80. {
  81. return [
  82. 'site_title' => config('app.name'),
  83. 'image_base_url' => config('liquid.image_base_url'),
  84. 'asset_base_url' =>config('liquid.asset_base_url'),
  85. 'font_base_url' => config('liquid.font_base_url'),
  86. 'dist' => app('dist'),
  87. 'menus_header'=>app('menus_header'),
  88. 'menus_footer'=>app('menus_footer'),
  89. ];
  90. }
  91. }