이 글에서는 주로 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('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', 'template'=>"{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('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를 사용하는 또 다른 이점은 보안 격리, 실제 코드를 보호된 경로에 배치하고 요청 시 로드하는 것입니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!
관련 권장 사항:
PHP의 사용자 정의 직렬화 인터페이스 Serialized의 사용 분석 정보
위 내용은 Yii 핵심 구성 요소 AssetManager의 원리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!