Symfony: версионирование статики с помощью asset

Symfony: версионирование статики с помощью asset

После обновления сайта пользователи могут не увидеть изменений по причине кеширования ресурсов их браузерами. Например, если было изменение в javascript/css файле, при этом ссылка на этот файл не поменялась. И теперь пока пользователь не сделает «принудительное обновление» (Hard reload / Force refresh), которое доступно по горячим клавишам «CTRL+R», «SHIFT+CTRL+R» или «CTRL+F5», то пользователь не увидит изменений.

Чтобы решить эту проблему, можно при обновлениях сайта менять адрес или параметры ссылки на скрипт. В некоторых системах каждый «рабочий билд» пересобирает статику в «бандл файл» (bundle) и у него при релизе будет новое имя. Обычно такое происходит если использовать какой нибудь webpack. Но что если в symfony проекте не используется webpack (что является довольно популярной практикой). Тогда можно использовать «Asset Component».

Что нужно сделать:

  1. Внутри шаблонов все ссылки на статику (или на контроллеры которые отдают статику) обернуь в функцию {{ asset() }}
    Пример:
    Symfony: версионирование статики с помощью asset - иллюстрация 1
  2. Необходимо придумать и реализовать код стратегии версионирования. Сделать это можно с помощью интерфейса: Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface
    Добавляем свою стратегию:
    Symfony: версионирование статики с помощью asset - иллюстрация 2
    Стратегия будет строится на наличии файла версии для статики. Этот файл может называться как угодно и находится где угодно, в зависимости от настроек. Поэтому определять версию будем по наличию этого файла: app_version_file_path
    Symfony: версионирование статики с помощью asset - иллюстрация 3
    Добавляем стратегию в конфигурацию фреймворка framework.yaml.
    Symfony: версионирование статики с помощью asset - иллюстрация 4
    На этом этапе все ссылки обёрнутые в asset функцию станут иметь вид определённый внутри функции applyVersion.
    Symfony: версионирование статики с помощью asset - иллюстрация 5
    Тут важно обратить внимание на то какие ссылки используются в проекте. Бывают ссылки с якорем, и в таком случае applyVersion должен уметь обрабатывать такие ссылки. Например: /img/sprite.svg#test-123
    Тогда при использовании applyVersion ссылка скорее всего перестанет работать и svg картинка не будет отображаться.
  3. Обновление сайта должно происходит в автоматическом или полу-автоматическом режиме. Допустим, в нашем случае это будет происходить с помощью bash скрипта. Тогда при вызове этого скрипта необходимо сгенерировать «файл версии статики». Можно сделать это с помощью вызова заранее созданной команды Command. Например, создадим команду app:mark-updated, которая создаёт файл по пути app_version_file_path.
    Symfony: версионирование статики с помощью asset - иллюстрация 6
    Теперь при каждом обновлении будет создаваться файлик с содержимым функции time() и это содержимое будет подставляться в параметр во всех функциях asset().

Итог

После обновления у всех пользователей браузер будет считывать файлы по «новым ссылкам» и следовательно обновления будут применяться сразу. При этом у разработчика есть возможность контролировать способ применения этих обновлений через разработку кода стратегии версионирования, разработку команды или организации вызова этой команды в зависимости от требований: нужно или не нужно заставлять браузер обновить статику на клиенте.

Все статьи →

Есть вопросы по статье?

Отправьте нам сообщение, и мы свяжемся с вами, чтобы всё обсудить

Приглашаем к сотрудничеству
120+
завершённых проектов
20+ лет
помогаем клиентам расти
123056, Москва, переулок Красина, дом 16, строение 1
Заполните форму и мы свяжемся с вами в ближайшее время!
Согласен с обработкой моих персональных данных
в соответствии с политикой конфиденциальности
123056, Россия, Москва, пер. Красина, д.16, стр.1
+7 (495) 477-60-74