>  기사  >  백엔드 개발  >  Yii 핵심 구성 요소 AssetManager의 원리 분석

Yii 핵심 구성 요소 AssetManager의 원리 분석

不言
不言원래의
2018-06-19 14:47:551267검색

이 글에서는 주로 Yii의 핵심 컴포넌트인 AssetManager의 원리 분석을 소개합니다. AssetManager 컴포넌트의 원리와 구현 과정을 좀 더 자세히 분석하여 yii 프레임워크의 특징을 심도 있게 이해하는 데 도움이 됩니다. 참고할 수 있습니다

이 기사에서는 yii를 사용하여 Yii 핵심 구성 요소 AssetManager를 분석하는 데 사용됩니다. CSS와 자바 스크립트를 자동으로 로드할 수 있으며 코드 한 줄만 필요합니다. 구체적인 분석은 다음과 같습니다.

블로그 홈페이지를 열면 다음과 같이 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의 실행 메서드를 살펴보세요.

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를 사용하는 또 다른 이점은 보안 격리, 실제 코드를 보호된 경로에 배치하고 요청 시 로드하는 것입니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP의 사용자 정의 직렬화 인터페이스 Serialized의 사용 분석 정보

PHP의 멀티 플레이어 모듈 개발 원칙

위 내용은 Yii 핵심 구성 요소 AssetManager의 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.