Yii 资产管理器的主要好处是它允许您以独立的方式构建组件。
一个小部件的故事
考虑一个作为 UI 小部件的组件。假设发行版包括几个资产以及组件实现,例如这些文件:
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/
哪里,是由 Yii 创建的随机散列,并保证不会与任何其他已发布的资产冲突。assets/
1337c0de/
这意味着 SuperWidget 的资产不可能与任何其他组件的资产发生冲突,从而使 SuperWidget 真正可重用。而且由于里面的目录结构1337c0de/
和你的发行版中的一样,CSS可以使用相对路径来引用图像,../images/
而不需要引用随机散列的值(只有发布后才知道)。
资产管理者不是什么
- 这不是提高安全性的方法。无论如何,您的组件源都将在内部某处
protected/
(因此那里没有改进),并且无论它们最终被复制到哪里,资产都需要可通过网络访问(无论如何它们都没有安全性)。
- 它不是处理资产的包罗万象的解决方案(例如缩小 CSS)。虽然可以安装一个自定义资产管理器来执行此操作,但不要忘记包含在可重用组件中的资产将在所有“基础应用程序”资产中占一小部分;如果你想全面缩小,你还必须处理其他所有事情,资产管理器不会帮助你。
TL;博士
资产管理器允许您制作易于分发的组件,并且可以包含在应用程序中,而不必担心与其他组件产生冲突。