本文我们通过yii自带的demo-blog程序来分析Yii核心组件AssetManager,他可以自动加载css和javascript,并且只需要一句代码即可。具体分析如下:
打开blog的首页,会看到如下的引入js的html代码:
<link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/d6bb6ebe/highlight.css" /> <link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/c2e28f0f/pager.css" /> <script type="text/javascript" src="/yii/demos/blog/assets/d6112c6a/jquery.min.js"></script> <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 $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{items}n{pager}", )); ?>
这个widget也是yii自带的zii扩展,于是乎我们可以找到zii的CListView代码,而CListView又是继承CBaseListView,因此先看CBaseListView的run方法:
public function run() { $this->registerClientScript(); echo CHtml::openTag($this->tagName,$this->htmlOptions)."n"; $this->renderKeys(); $this->renderContent(); echo CHtml::closeTag($this->tagName); }
请注意第一个方法registerClientScript,这个方法是在CListView中实现的:
public function registerClientScript() { …… $cs=Yii::app()->getClientScript(); $cs->registerCoreScript('jquery'); $cs->registerCoreScript('bbq'); …… }
看到jquery和bbp似乎离真相近了些,接下来我们看CClientScript::registerCoreScript方法:
public function registerCoreScript($name) { $this->_hasScripts=true; $this->_coreScripts[$name]=$name; $params=func_get_args(); $this->recordCachingAction('clientScript','registerCoreScript',$params); }
这里其实主要是记录了最终页面要render的js,而实际生成render的url是通过getCoreScriptUrl方法:
public function getCoreScriptUrl() { if($this->_baseUrl!==null) return $this->_baseUrl; else return $this->_baseUrl=Yii::app()->getAssetManager()->publish(YII_PATH.'/web/js/source'); }
接下来我们看看publish的具体过程:
public function publish($path,$hashByName=false,$level=-1,$forceCopy=false) { if(is_file($src)) { $dir=$this->hash($hashByName ? basename($src) : dirname($src)); $fileName=basename($src); …… else if(is_dir($src)) { $dir=$this->hash($hashByName ? basename($src) : $src); $dstDir=$this->getBasePath().DIRECTORY_SEPARATOR.$dir; …… }
这里通过对路径做了hash处理,因此我们看到的路径是不规则的,而由于jq系列的js代码均在同一路径下(都在framework/web/js/source下),所以hash值是相同的。
另外,除了如上所述,CAssetManager使得多个模块可以复用相同的代码制外,使用CAssetManager的另外一个好处是安全隔离,将真实的代码放在受保护的路径下,按需加载。
希望本文所述对大家基于yii框架的PHP程序设计有所帮助。
本文向大家介绍Ajax技术组成与核心原理分析,包括了Ajax技术组成与核心原理分析的使用技巧和注意事项,需要的朋友参考一下 本文主要为大家分析了Ajax技术组成原理,供大家参考,具体内容如下 1、Ajax 特点:局部刷新、提高用户的体验度,数据从服务器商加载 2、AJax的技术组成 不是新技术,而是之前技术的整合 Ajax: Asynchronous Javascript And Xml;(异步
介绍Kubernetes架构以及核心概念。
Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes 的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原语上进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。 Kubernetes 具备完善的集群管理
主要内容:1.kubernetes 架构,2.从创建 deployment 开始,3.Pod,3.容器编排,4.水平扩缩容,5.更新/回滚,6.滚动更新,7.kubernetes 中的网络,8.微服务—service,9.kubernetes 中的服务发现与网络调用kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 1.kubernetes 架构 从宏观上来看 kubernetes 的整体架构,包
Kubernetes主要由以下几个核心组件组成: etcd保存了整个集群的状态; apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制; controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等; scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上; kubelet负责维护容器的生命周期,同时也
主要内容:前言,一、Dubbo架构详解,二、动手写Dubbo,1.模拟服务提供者,2.测试服务提供者,3.模拟服务消费者,4.总结前言 我觉得通过学习源码,可以获取到与大师交流的机会,优秀的设计能让我在编程思想上得到锻炼提升,也会让我去更注重自己的代码质量 ! 一、Dubbo 架构详解 理解Dubbo前,最好先手动画一下dubbo的架构图,画图理解架构是最清晰有效地方式。各模块的职责: 注册中心: 提供服务发现与注册功能, 如果服务发生变动通过watch机制通知服务消