outputDir = $outputDir; } public function getFunctions(): array { return [ new TwigFunction('hashed_asset', [$this, 'createHashedFileLink']), ]; } public function createHashedFileLink(string $path): string { $fullPath = $this->join($this->outputDir, $path); $realPath = realpath($fullPath); if (!file_exists($realPath)) { return sprintf('%s?v=%s', $path, time()); } $hash = md5_file($realPath); return sprintf('%s?v=%s', $path, $hash); } private function join(string $base, string $path): string { return $path ? rtrim($base, '/').'/'.ltrim($path, '/') : $base; } }