Основным преимуществом менеджера активов Yii является то, что позволяет вам структурировать свои компоненты автономно .
Сказка о виджете
Рассмотримкомпонент, который является виджетом пользовательского интерфейса.Предположим, что в дистрибутив входит пара ресурсов вместе с реализацией компонента, например, эти файлы:
SuperWidget.php
superwidget.css
superwidget.js
image_for_css.png
Рассмотрим, как бы вы включили этот виджет в свое приложение, если бы менеджер активов не существовал.Типичные шаги могут включать в себя:
- Копирование
SuperWidget.php
где-нибудь в каталоге protected/
- Копирование
superwidget.js
в ваш каталог js/
- Копирование
superwidget.css
в каталог css/
- Скопируйте
image_for_css.png
в каталог images/
или, возможно, также внутри css/
, чтобы уменьшить относительные зависимости пути
Затем во время выполнения SuperWidgetбудет генерировать соответствующие теги для включения CSS и JavaScript; для этого нужно знать, где именно вы разместили эти активы .Другими словами: некоторые варианты установки могут быть сделаны произвольно, но затем они устанавливаются в камне, если вы не идете и не редактируете источник .
Является ли виджет многоразовым?
Если бы этот виджет был сильно настроен и должен был стать неотъемлемой частью вашего приложения, тогда этот подход работал бы нормально, и не было бы особой нужды иметь менеджера активов.Но что, если это очень полезный компонент, который вы хотите распространять?
Проблемы начинают возникать.
Прежде всего, рассмотренная схема развертывания требует, чтобы пользователи виджета копировали разные файлы в разныекаталоги, усложняющие процедуру установки и увеличивающие вероятность ошибки.
Но большая проблема заключается в том, что ваша схема развертывания может конфликтовать с любой другой компонентой, разработанной независимо от вашей.Что, если кто-то еще решил иметь файл superwidget.js
тоже?
Если инструкции по установке этих двух компонентов конфликтуют, то очевидно, что один из них не может быть установлен должным образом, и тогда вы прибегаете к изменению некоторых деталей и взломуисходный код компонента для учета этих изменений.Если вы позже обновите до более новой версии этого компонента, вы будете вынуждены тщательно учитывать ваши настройки, делая невозможным обновление «копирование / перезапись».
Все это на самом деле не красиво, и хотя это можетмаловероятно, что это случится на практике, это, безусловно, не будет правильным.
Менеджер активов, сделайте так
Вот где приходит менеджер активов. Давайте предположим, что вы решили структурировать свой компонент следующим образом:
superwidget/
SuperWidget.php
assets/
css/
superwidget.css
js/
superwidget.js
images/
image_for_css.png
Вы можете напрямую скопировать это куда-нибудь в каталог protected/
независимо от того, какие другие компоненты вы установили;наихудшее, что здесь может произойти, это то, что вам придется переименовать superwidget/
во что-то еще, если возник конфликт.
Используя менеджер активов, SuperWidget.php
публикует всеКаталог superwidget/assets/
, копия которого заканчивается, например, assets/1337c0de/
, где assets/
- путь базового ресурса вашего приложения, а 1337c0de/
- случайный хеш, созданный Yii и гарантированно не конфликтующий с любым другим опубликованным активом.
Это означает, что ресурсы для SuperWidget не могут конфликтовать с активами любого другого компонента , что делает SuperWidget действительно повторно используемым.А поскольку структура каталогов внутри 1337c0de/
будет такой же, как и в вашем дистрибутиве, CSS может ссылаться на изображения, используя относительный путь ../images/
, без необходимости ссылаться на значение случайного хэша (который известен только после публикации).
Чем не является менеджер активов
- Это не способ повысить безопасность.В любом случае, ваш источник компонента будет где-то внутри
protected/
(поэтому никаких улучшений там нет), и ресурсы должны быть доступны через Интернет независимо от того, где они в конечном итоге копируются (для них нет защиты, несмотря ни на что). - Это не универсальное решение для обработки ваших активов (например, минимизация CSS).Хотя есть возможность установить собственный менеджер ресурсов, который делает это, не забывайте, что активы, включенные в повторно используемые компоненты, будут небольшим меньшинством среди всех ваших активов «базового приложения»;если вам нужна минификация по всем направлениям, вам также придется обрабатывать все остальное, и менеджер активов вам там не поможет.
TL; DR
Менеджер активов позволяет вамсоздавать компоненты, которые легко распространяются и могут быть включены в приложения, не опасаясь конфликтов с другими компонентами.