Php 什么';这就是Yii&x27;谁是资产管理人?

Php 什么';这就是Yii&x27;谁是资产管理人?,php,yii,Php,Yii,我找不到关于Yii的AssetManager用于管理JS和CSS文件的太多信息。我这里的问题是,使用AssetManager有什么意义?我不确定它为我的开发过程增加了什么价值,事实上,它似乎使我的代码复杂化了。。。每次我更改脚本或css代码时,我都必须进入并删除我的资产文件夹,以确保我拥有最新版本 似乎将所有Javascript文件放在/webroot/js/下并使用标记加载文件要简单得多,而不用经历AssetManager的麻烦。另外,Yii的registerCoreScript函数总是将脚本

我找不到关于Yii的AssetManager用于管理JS和CSS文件的太多信息。我这里的问题是,使用AssetManager有什么意义?我不确定它为我的开发过程增加了什么价值,事实上,它似乎使我的代码复杂化了。。。每次我更改脚本或css代码时,我都必须进入并删除我的资产文件夹,以确保我拥有最新版本

似乎将所有Javascript文件放在/webroot/js/下并使用标记加载文件要简单得多,而不用经历AssetManager的麻烦。另外,Yii的registerCoreScript函数总是将脚本标记放在header标记内,而不是像YSlow建议的那样,将它们放在代码的底部,靠近结束体标记

我想我对易易的资产管理人的理解一定有差距。有人知道为什么使用AssetManager比在PHP代码中硬编码脚本标记更好吗?我有点困惑


谢谢

我相信有人能比我更好地回答这个问题,但基本上,这是为了让您的源代码JS和CSS文件可以保留在受保护的文件夹中

首先,这有点安全,但对我来说主要的好处是,您可以使用资产发布系统压缩、缩小或以其他方式处理您的资产,并且它使您更容易在CDN上托管JS和CSS,因为它与您的代码库是分开的


此外,这里还有一个(写Yii的人)关于这一点。

Yii的资产管理器的主要好处是它允许您以一种自包含的方式构建组件

小部件的故事 考虑一个作为UI小部件的组件。让我们假设发行版包括两个资产以及组件实现,例如以下文件:

SuperWidget.php
superwidget.css
superwidget.js
image_for_css.png
考虑如果资产管理器不存在,您将如何将此小部件合并到应用程序中。典型步骤可能包括:

  • SuperWidget.php
    复制到
    protected/
    目录中的某个地方
  • superwidget.js
    复制到您的
    js/
    目录中
  • superwidget.css
    复制到您的
    css/
    目录中
  • image\u 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
    
    您可以直接将其复制到
    受保护的/
    目录中的某个位置,而不管您安装了其他什么组件;这里可能发生的最糟糕的事情是,如果发生冲突,您必须将
    superwidget/
    重命名为其他名称

    使用资产管理器,
    SuperWidget.php
    整个
    SuperWidget/assets/
    目录,副本的结尾是,例如,
    assets/1337c0de/
    ,其中
    assets/
    是应用程序的基本资产路径,
    1337c0de/
    是Yii创建的随机散列,保证不会与任何其他发布的资产冲突

    这意味着SuperWidget的资产不可能与任何其他组件的资产冲突,从而使SuperWidget真正可重用。由于
    1337c0de/
    中的目录结构与您的发行版中的目录结构相同,CSS可以使用相对路径
    。/images/
    引用图像,而无需引用随机散列的值(只有在发布后才知道)

    资产管理人不是什么
    • 这不是增加安全性的方法。不管怎样,您的组件源代码将在
      受保护的/
      中的某个地方(因此没有任何改进),并且资产需要可以通过web访问,无论它们最终被复制到哪里(无论发生什么情况,它们都没有安全性)
    • 它不是处理您的资产(例如缩小CSS)的全面解决方案。虽然可以安装一个定制的资产管理器来实现这一点,但不要忘记,可重用组件中包含的资产在所有“基本应用程序”资产中只占少数;如果你想全面缩小规模,你还必须处理其他所有事情和屁股