Maison  >  Article  >  développement back-end  >  Analyse principale du composant principal de Yii AssetManager

Analyse principale du composant principal de Yii AssetManager

不言
不言original
2018-06-19 14:47:551281parcourir

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(&#39;zii.widgets.CListView&#39;, array(
&#39;dataProvider&#39;=>$dataProvider,
&#39;itemView&#39;=>&#39;_view&#39;,
&#39;template&#39;=>"{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(&#39;jquery&#39;);
$cs->registerCoreScript(&#39;bbq&#39;);
……
}

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(&#39;clientScript&#39;,&#39;registerCoreScript&#39;,$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.&#39;/web/js/source&#39;);
}

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 de l'analyse de l'utilisation de l'interface de sérialisation personnalisée de PHP Serialisable

À 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn