Cet article présente principalement l'analyse du principe d'AssetManager, le composant principal de Yii. Il analyse plus en détail le principe et le processus de mise en œuvre du composant AssetManager, ce qui aidera à acquérir une compréhension approfondie des caractéristiques du composant. yii. Les amis dans le besoin peuvent s'y référer
Dans cet article, nous utilisons le programme de démonstration-blog fourni avec yii pour analyser le composant principal AssetManager de Yii. Il peut charger automatiquement le CSS et le javascript et ne nécessite que. une ligne de code. L'analyse spécifique est la suivante :
Lorsque vous ouvrez la page d'accueil du blog, vous verrez le code html suivant qui introduit js :
<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>
Les chemins de ces fichiers js sont tous dans le dossier Assets, suivi de Assets. Un chemin de dossier qui a visiblement été haché est le même que le chemin du code js appartenant à jq. D'où vient ce code ?
En regardant directement le fichier de vue, vous ne pouvez voir aucun code qui introduit js, il devrait donc être introduit à l'aide du widget :
<?php $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{items}n{pager}", )); ?>
Ce widget est également l'extension Zii fournie avec Yii, nous pouvons donc trouver le code CListView de Zii, et CListView hérite de CBaseListView, alors regardez d'abord la méthode d'exécution de CBaseListView :
public function run() { $this->registerClientScript(); echo CHtml::openTag($this->tagName,$this->htmlOptions)."n"; $this->renderKeys(); $this->renderContent(); echo CHtml::closeTag($this->tagName); }
Veuillez faire attention à la première méthode registerClientScript, qui est implémentée dans CListView :
public function registerClientScript() { …… $cs=Yii::app()->getClientScript(); $cs->registerCoreScript('jquery'); $cs->registerCoreScript('bbq'); …… }
Voyant que jquery et bbp semblent être plus proches de la vérité, voyons ensuite la méthode CClientScript::registerCoreScript :
public function registerCoreScript($name) { $this->_hasScripts=true; $this->_coreScripts[$name]=$name; $params=func_get_args(); $this->recordCachingAction('clientScript','registerCoreScript',$params); }
Cela enregistre en fait principalement les js à rendre sur la page finale, et l'URL réelle rendue est générée via la méthode getCoreScriptUrl :
public function getCoreScriptUrl() { if($this->_baseUrl!==null) return $this->_baseUrl; else return $this->_baseUrl=Yii::app()->getAssetManager()->publish(YII_PATH.'/web/js/source'); }
Suivant Jetons un coup d'œil au processus spécifique de publication :
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; …… }
Ici, le chemin est haché, donc le chemin que nous voyons est irrégulier, et puisque le code js de la série jq se trouve sous le même chemin (Tous sous framework/web/js/source), la valeur de hachage est donc la même.
De plus, en plus de ce qui précède, CAssetManager permet à plusieurs modules de réutiliser le même code, un autre avantage de l'utilisation de CAssetManager est l'isolation de sécurité, en plaçant le vrai code dans un chemin protégé, appuyez sur Doit être chargé.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
À propos des principes de développement de modules multi-joueurs en PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!