不积跬步无以至千里

记录精彩的程序人生

  • 首页
  • Java
  • Golang
  • PHP
  • Python
  • Nodejs
  • Lua
  • Docker
  • DevOps
  • 文章归档
  • 默认分类
  • 关于
  • 标签

  • 搜索
PostgreSQL hbase 时间同步 nexus 开机启动 nexus, 开机启动 jenkins安装配置 gitlab安装配置 gitlab安装 文件系统 fastdfs gcc切换 gcc升级 mysql8 交换空间 虚拟内存 tcp thrift lua tag test VPN SoftEtherVPN homebrew asm spring tomcat maven jdk ios mac 图案字符 figlet mysql半同步复制 mysql主从同步 一主多从 一主一从 主从同步 反向代理 密码重置 test 虚拟机扩容 swap 虚拟空间 docker ldocker grpc-gateway protobuf 微服务 go grp GRPC 授权登录 OAuth2.0 SOA supervisord supervisor RPC CentOS rabbitmq 环境变量 php-fpm php.ini error php7 lnmp 编译安装 mysql nginx linux java php python redis 字符串操作 mysql5.7 Solo

Yii分析13:Yii核心组件之AssetManager

发表于 2020-12-26 | 分类于 默认分类 | 0 | 阅读次数 1613

我们通过使用来讲解CAssetManager的使用和工作机制,可以直接看yii自带的demo-blog,打开blog的首页,会看到如下的引入js的html代码:

Html代码  收藏代码
  1. <link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/d6bb6ebe/highlight.css" />
  2. <link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/c2e28f0f/pager.css" />
  3. <script type="text/javascript" src="/yii/demos/blog/assets/d6112c6a/jquery.min.js"></script>
  4. <script type="text/javascript" src="/yii/demos/blog/assets/d6112c6a/jquery.ba-bbq.js"></script>
这些js文件的路径都在assets文件夹下,assets后面跟着一个显然经过hash的文件夹路径,同属于jq的js代码的路径相同,这段代码从何而来呢?

直接看view文件看不到任何引入js的代码,因此应该是使用widget引入的:

Php代码  收藏代码
  1. <?php $this->widget('zii.widgets.CListView', array(
  2. 'dataProvider'=>$dataProvider,
  3. 'itemView'=>'_view',
  4. 'template'=>"{items}n{pager}",
  5. )); ?>
这个widget也是yii自带的zii扩展,于是乎我们可以找到zii的CListView代码,而CListView又是继承CBaseListView,因此先看CBaseListView的run方法:
Php代码  收藏代码
  1. public function run()
  2. {
  3. $this->registerClientScript();
  4. echo CHtml::openTag($this->tagName,$this->htmlOptions)."n";
  5. $this->renderKeys();
  6. $this->renderContent();
  7. echo CHtml::closeTag($this->tagName);
  8. }
请注意第一个方法registerClientScript,这个方法是在CListView中实现的:
Php代码  收藏代码
  1. public function registerClientScript()
  2. {
  3. ……
  4. $cs=Yii::app()->getClientScript();
  5. $cs->registerCoreScript('jquery');
  6. $cs->registerCoreScript('bbq');
  7. ……
  8. }
看到jquery和bbp似乎离真相近了些,接下来我们看CClientScript::registerCoreScript方法:
Php代码  收藏代码
  1. public function registerCoreScript($name)
  2. {
  3. $this->_hasScripts=true;
  4. $this->_coreScripts[$name]=$name;
  5. $params=func_get_args();
  6. $this->recordCachingAction('clientScript','registerCoreScript',$params);
  7. }
这里其实主要是记录了最终页面要render的js,而实际生成render的url是通过getCoreScriptUrl方法:
Php代码  收藏代码
  1. public function getCoreScriptUrl()
  2. {
  3. if($this->_baseUrl!==null)
  4. return $this->_baseUrl;
  5. else
  6. return $this->_baseUrl=Yii::app()->getAssetManager()->publish(YII_PATH.'/web/js/source');
  7. }
接下来我们看看publish的具体过程:
Php代码  收藏代码
  1. public function publish($path,$hashByName=false,$level=-1,$forceCopy=false)
  2. {
  3. if(is_file($src))
  4. {
  5. $dir=$this->hash($hashByName ? basename($src) : dirname($src));
  6. $fileName=basename($src);
  7. ……
  8. else if(is_dir($src))
  9. {
  10. $dir=$this->hash($hashByName ? basename($src) : $src);
  11. $dstDir=$this->getBasePath().DIRECTORY_SEPARATOR.$dir;
  12. ……
  13. }
这里通过对路径做了hash处理,因此我们看到的路径是不规则的,而由于jq系列的js代码均在同一路径下(都在framework/web/js/source下),所以hash值是相同的。
另外,除了如上所述,CAssetManager使得多个模块可以复用相同的代码制外,使用CAssetManager的另外一个好处是安全隔离,将真实的代码放在受保护的路径下,按需加载。
Yii日志记录
linux CentOS系统下如何将php和mysql命令加入到环境变量中
  • 文章目录
  • 站点概览
ken

ken

记录精彩的程序人生

498 日志
9 分类
77 标签
RSS
Creative Commons
Links
  • 酷壳
0%
© 2010 — 2026 ken
由 Halo 强力驱动
鄂ICP备18013899号-1