ホームページ  >  記事  >  バックエンド開発  >  YiiコアコンポーネントAssetManagerの原理分析

YiiコアコンポーネントAssetManagerの原理分析

不言
不言オリジナル
2018-06-19 14:47:551266ブラウズ

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

jquery と bbp が真実に近いように見えます。 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);
}

これは実際には主に最終ページでレンダリングされる js を記録し、実際にレンダリングされる URL は 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;);
}

次に、公開の具体的なプロセスを見てみましょう:

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 の使用分析について

PHP でのマルチプレイヤー モジュール開発の原則について

以上がYiiコアコンポーネントAssetManagerの原理分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。