Як використовувати стратегію користувацьких версій для ресурсів

Дата оновлення перекладу 2022-11-20

Як використовувати стратегію користувацьких версій для ресурсів

Версіонування ресурсів - це техніка, яка покращує продуктивність веб-додатків, додаючи ідентифікатор версії до URL статичних ресурсів (CSS, JavaScript, зображення та ін.). Коли змість ресурсу змінюється, його ідентифікатор також змінюється, щоб змусити браузер завантажити його наново, замість повторного використання кешованого ресурсу.

Якщо вашому додатку необхідно просунуте версіонування, на кшталт генерування версії динамісно, засновуючись на деякій зовнішній інформації, ви можете створити власну стратегію версій.

Note

Symfony надає різні реалізації, що відключають кешування, за допомогою опцій конфігурації version , version_format , і json_manifest_path .

Створення власної стратегії версій

Наступний приклад демонструє, як створити стратегію версій, сумісну з gulp-buster. Цей інструмент визначає файл конфігурації під назвою busters.json, який зʼєднує кожний файл ресурсу з його хешем змісту:

1
2
3
4
{
    "js/script.js": "f9c7afd05729f10f55b689f36bb20172",
    "css/style.css": "91cd067f79a5839536b46c494c4272d8"
}

Реалізація VersionStrategyInterface

Стратегії версій ресурсів - це PHP-класи, які реалізують VersionStrategyInterface. У цьому прикладі, конструктор класу бере в якості аргументів шлях до файлу маніфесту, згенерованого gulp-buster і формат згенерованого рядку версії:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// src/Asset/VersionStrategy/GulpBusterVersionStrategy.php
namespace App\Asset\VersionStrategy;

use Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface;

class GulpBusterVersionStrategy implements VersionStrategyInterface
{
    /**
     * @var string
     */
    private $manifestPath;

    /**
     * @var string
     */
    private $format;

    /**
     * @var string[]
     */
    private $hashes;

    /**
     * @param string      $manifestPath
     * @param string|null $format
     */
    public function __construct($manifestPath, $format = null)
    {
        $this->manifestPath = $manifestPath;
        $this->format = $format ?: '%s?%s';
    }

    public function getVersion($path)
    {
        if (!is_array($this->hashes)) {
            $this->hashes = $this->loadManifest();
        }

        return isset($this->hashes[$path]) ? $this->hashes[$path] : '';
    }

    public function applyVersion($path)
    {
        $version = $this->getVersion($path);

        if ('' === $version) {
            return $path;
        }

        $versionized = sprintf($this->format, ltrim($path, '/'), $version);

        if ($path && '/' === $path[0]) {
            return '/'.$versionized;
        }

        return $versionized;
    }

    private function loadManifest()
    {
        return json_decode(file_get_contents($this->manifestPath), true);
    }
}

Реєстрація сервісу стратегії

Після створення стратегії PHP-класу, зареєструйте його в якості сервісу Symfony.

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
# config/services.yaml
services:
    App\Asset\VersionStrategy\GulpBusterVersionStrategy:
        arguments:
            - "%kernel.project_dir%/busters.json"
            - "%%s?version=%%s"

Нарешті, підключіть нове версіонування ресурсів для всіх ресурсів додатку або лише для деяких пакетів ресурсів , завдяки опції version_strategy :

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/framework.yaml
framework:
    # ...
    assets:
        version_strategy: 'App\Asset\VersionStrategy\GulpBusterVersionStrategy'