LiquidRenderer.php 3.5 KB

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