zend-blog-3-backend
56 строк · 1.3 Кб
1<?php
2
3namespace App\Twig\Extension;
4
5use App\Exception\Twig\AssetNotExistException;
6use Twig\Extension\AbstractExtension;
7use Twig\TwigFunction;
8
9class Assets extends AbstractExtension
10{
11public function getFunctions()
12{
13return [
14new TwigFunction(
15'assets',
16[$this, 'assets'],
17[
18'is_safe' => ['html'],
19]
20),
21];
22}
23
24public function assets(string $path): string
25{
26$matches = [];
27if (!preg_match('/^(?P<prefix>.+)\.(?P<ext>css|js)$/', $path, $matches)) {
28return "<unknown src=\"{$path}\"/>";
29}
30
31if ($matches['ext'] === 'css') {
32$format = '<link rel="stylesheet" href="%s.v%d.css">';
33} else {
34$format = '<script src="%s.v%d.js"></script>';
35}
36
37return sprintf($format, $matches['prefix'], $this->version($path));
38}
39
40/**
41* @param string $path
42*
43* @return int
44*/
45private function version(string $path): int
46{
47$file = APP_WEB_DIR . $path;
48if (!is_file($file)) {
49throw new AssetNotExistException('File not exist: ' . $file);
50}
51
52$mtime = (int)filemtime($file);
53
54return $mtime - (($mtime >> 20) << 20);
55}
56}
57