12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- <?php
- namespace App\Services;
- use Liquid\Template;
- use Liquid\Cache\File as FileCache;
- use Illuminate\Support\Facades\File;
- class LiquidRenderer
- {
- protected static $baseTemplatePath;
- public static function render(string $templateName, array $data = []): string
- {
- // 初始化基础模板路径(仅在首次调用时)
- if (!self::$baseTemplatePath) {
- self::$baseTemplatePath = config('liquid.template_path');
- }
- // 查找模板文件
- $templatePath = self::findTemplate($templateName);
- if (!$templatePath) {
- throw new \Exception("Template not found: {$templateName}");
- }
- // 读取 Liquid 模板文件内容
- $templateContent = File::get($templatePath);
- // 创建并解析模板
- $template = new Template();
- $template->setCache(new FileCache(['cache_dir' => storage_path('framework/cache/data')]));
- $template->parse($templateContent);
- // 渲染模板并返回结果
- return $template->render($data);
- }
- protected static function findTemplate(string $templateName): ?string
- {
- // 如果模板名没有以 .liquid 结尾,则添加 .liquid 扩展名
- if (pathinfo($templateName, PATHINFO_EXTENSION) !== 'liquid') {
- $templateName .= '.liquid';
- }
- // 处理模板名中的 . 号,将其转换为目录分隔符(不包括扩展名)
- $templateNameWithoutExtension = pathinfo($templateName, PATHINFO_FILENAME);
- $templatePathSegments = explode('.', $templateNameWithoutExtension);
- $relativePath = implode(DIRECTORY_SEPARATOR, $templatePathSegments) . '.liquid';
- // 构建预期的模板路径
- $expectedPath = self::$baseTemplatePath . DIRECTORY_SEPARATOR . $relativePath;
- if (File::exists($expectedPath)) {
- return $expectedPath;
- }
- return null;
- }
- }
|