この記事では、Yii のコアコンポーネントである AssetManager の原理分析を主に紹介し、Yii フレームワークの特徴をより深く理解するのに役立つ、AssetManager コンポーネントの原理と実装プロセスをより詳細に分析します。必要な友人は参照してください
この記事では、yii に付属するデモブログ プログラムを使用して、Yii のコア コンポーネント AssetManager を分析します。このプログラムは CSS と JavaScript を自動的にロードでき、必要なのは 1 行だけです。コードの。具体的な分析は次のとおりです。
ブログのホームページを開くと、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 ファイルのパスはすべてアセット内にあります。フォルダー、およびアセットの後には、明らかなハッシュ フォルダー パスが、jq に属する js コードのパスと同じです。
ビュー ファイルを直接見ると、次のことがわかります。 js を導入するコードは見当たりません。そのため、ウィジェットを使用する必要があります。紹介:
<?php $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{items}n{pager}", )); ?>
このウィジェットは、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); }
これは実際には主に最終ページでレンダリングされる js を記録し、実際にレンダリングされる 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'); }
次に、公開の具体的なプロセスを見てみましょう:
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; …… }
ここではパスがハッシュ化されているため、表示されるパスは不規則であり、jq シリーズの JS コードはすべて同じパス下にあるため (すべて Framework/web/js/source 配下)、ハッシュの値は同じです。
さらに、上記に加えて、CAssetManager を使用すると、複数のモジュールが同じコードを再利用できます。CAssetManager を使用するもう 1 つの利点は、セキュリティの分離であり、実際のコードを保護されたパスに配置し、ロードする必要があります。
上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
PHP のカスタム シリアル化インターフェイス Serializable の使用分析について
以上がYiiコアコンポーネントAssetManagerの原理分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。