Yii의 리소스는 웹 페이지와 관련된 파일로 CSS 파일, JavaScript 파일, 이미지 또는 비디오 등이 될 수 있습니다. 리소스는 웹에 액세스할 수 있는 디렉터리에 배치되며 웹 서버에서 직접 호출됩니다.
예를 들어, 페이지에서 yiijuiDatePicker 위젯을 사용하면 필요한 CSS 및 JavaScript 파일을 수동으로 찾아서 포함시키는 대신 자동으로 리소스를 관리하는 것이 좋습니다. 위젯을 업그레이드하면 자동으로 새 버전의 리소스 파일이 사용됩니다. 이 튜토리얼에서는 Yii가 제공하는 강력한 리소스 관리 기능을 자세히 설명합니다.
리소스팩
Yii는 리소스 패키지에서 리소스를 관리합니다. 리소스 패키지는 단순히 디렉터리에 있는 리소스 모음입니다. 리소스 패키지가 뷰에 등록되면 웹 페이지를 렌더링할 때 패키지의 CSS 및 JavaScript 파일이 포함됩니다.
리소스 패키지 정의
리소스 패키지는 yiiwebAssetBundle을 상속하는 PHP 클래스로 지정됩니다. 패키지 이름은 자동으로 로드할 수 있는 PHP 클래스 이름이며, 리소스 패키지 클래스에는 CSS 및 JavaScript가 포함된 리소스의 위치를 지정해야 합니다. 포함된 파일 및 다른 패키지와의 종속성.
다음 코드는 기본 애플리케이션 템플릿에서 사용되는 기본 리소스 패키지를 정의합니다.
<?php namespace app\assets; use yii\web\AssetBundle; class AppAsset extends AssetBundle { public $basePath = '@webroot'; public $baseUrl = '@web'; public $css = [ 'css/site.css', ]; public $js = [ ]; public $depends = [ 'yii\web\YiiAsset', 'yii\bootstrap\BootstrapAsset', ]; }
위와 같이 AppAsset 클래스에서 지정한 리소스 파일은 @webroot 디렉터리에 위치하며 해당 URL은 @web입니다. 리소스 패키지에는 JavaScript 파일이 아닌 CSS 파일인 css/site.css가 포함되어 있습니다. 다른 두 패키지 yiiwebYiiAsset 및 yiibootstrapBootstrapAsset 정보 yiiwebAssetBundle의 속성에 대한 자세한 내용은 아래에 설명되어 있습니다.
yiiwebAssetBundle::baseUrl: yiiwebAssetBundle::basePath 디렉터리에 해당하는 URL을 지정합니다. yiiwebAssetBundle::basePath 속성을 지정하면 리소스 관리자가 이러한 리소스를 게시하고 이 속성을 재정의합니다. 여기서 경로 별칭을 사용할 수 있습니다.
yiiwebAssetBundle::js: 리소스 번들의 JavaScript 파일을 포함하는 배열입니다. 슬래시 "/"를 디렉터리 구분 기호로 사용해야 합니다. 각 JavaScript 파일은 다음 두 가지 형식 중 하나로 지정할 수 있습니다.
리소스 위치
리소스는 위치에 따라 분류될 수 있습니다.소스 리소스: 리소스 파일과 PHP 소스 코드는 함께 배치되며 웹에서 직접 액세스할 수 없습니다. 이러한 소스 리소스를 사용하려면 웹에서 액세스할 수 있는 웹 디렉터리에 복사하여 게시된 리소스로 만들어야 합니다. 퍼블리싱이라고 합니다. 리소스에 대해서는 나중에 자세히 소개하겠습니다.
리소스 게시: 리소스 파일은 웹을 통해 직접 액세스할 수 있는 웹 디렉터리에 배치됩니다.
외부 리소스: 리소스 파일은 웹 애플리케이션과 다른 웹 서버에 배치됩니다.
리소스 번들 클래스를 정의할 때 yiiwebAssetBundle::sourcePath 속성을 지정하면 상대 경로를 사용하는 모든 리소스가 소스 리소스로 사용된다는 의미입니다. 이 속성을 지정하지 않으면 해당 리소스가 게시된 리소스라는 의미입니다. yiiwebAssetBundle::basePath를 지정하고 yiiwebAssetBundle::baseUrl을 Yii에게 알려야 합니다.
확장 기능의 경우 해당 리소스와 소스 코드가 웹에서 접근할 수 없는 디렉터리에 있으므로 리소스 번들 클래스를 정의할 때 yiiwebAssetBundle::sourcePath 속성을 지정해야 합니다.
참고: yiiwebAssetBundle::sourcePath 속성에 @webroot/assets를 사용하지 마십시오. 이 경로는 yiiwebAssetManager 리소스 관리자가 소스 리소스를 게시한 후 저장하는 경로로 기본 설정됩니다. 삭제될 수 있습니다.
리소스 종속성
리소스 종속성은 주로 yiiwebAssetBundle::dependent 속성을 통해 지정됩니다. AppAsset 예에서 리소스 번들은 두 개의 다른 리소스 번들인 yiiwebYiiAsset 및 yiibootstrapBootstrapAsset에 종속됩니다. 파일이 포함된 후에 두 개의 종속성 번들이 포함됩니다.
리소스 종속성은 전이적입니다. 즉, 사람들이 A가 B에 의존하고 B가 C에 의존한다고 말하면 A도 C에 의존합니다.
리소스 옵션
可指定yii\web\AssetBundle::cssOptions 和 yii\web\AssetBundle::jsOptions 属性来自定义页面包含CSS和JavaScript文件的方式, 这些属性值会分别传递给 yii\web\View::registerCssFile() 和 yii\web\View::registerJsFile() 方法, 在视图 调用这些方法包含CSS和JavaScript文件时。
注意: 在资源包类中设置的选项会应用到该包中 每个 CSS/JavaScript 文件,如果想对每个文件使用不同的选项, 应创建不同的资源包并在每个包中使用一个选项集。
例如,只想IE9或更高的浏览器包含一个CSS文件,可以使用如下选项:
public $cssOptions = ['condition' => 'lte IE9'];
这会是包中的CSS文件使用以下HTML标签包含进来:
<!--[if lte IE9]> <link rel="stylesheet" href="path/to/foo.css"> <![endif]-->
为链接标签包含
public $cssOptions = ['noscript' => true];
为使JavaScript文件包含在页面head区域(JavaScript文件默认包含在body的结束处)使用以下选项:
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
Bower 和 NPM 资源
大多数 JavaScript/CSS 包通过Bower 和/或 NPM管理, 如果你的应用或扩展使用这些包,推荐你遵循以下步骤来管理库中的资源:
修改应用或扩展的 composer.json 文件将包列入require 中, 应使用bower-asset/PackageName (Bower包) 或 npm-asset/PackageName (NPM包)来对应库。
创建一个资源包类并将你的应用或扩展要使用的JavaScript/CSS 文件列入到类中, 应设置 yii\web\AssetBundle::sourcePath 属性为@bower/PackageName 或 @npm/PackageName, 因为根据别名Composer会安装Bower或NPM包到对应的目录下。
注意: 一些包会将它们分布式文件放到一个子目录中,对于这种情况,应指定子目录作为 yii\web\AssetBundle::sourcePath属性值,例如,yii\web\JqueryAsset使用 @bower/jquery/dist 而不是 @bower/jquery。
使用资源包
为使用资源包,在视图中调用yii\web\AssetBundle::register()方法先注册资源, 例如,在视图模板可使用如下代码注册资源包:
use app\assets\AppAsset; AppAsset::register($this); // $this 代表视图对象
如果在其他地方注册资源包,应提供视图对象,如在 小部件 类中注册资源包, 可以通过 $this->view 获取视图对象。
当在视图中注册一个资源包时,在背后Yii会注册它所依赖的资源包,如果资源包是放在Web不可访问的目录下,会被发布到可访问的目录, 后续当视图渲染页面时,会生成这些注册包包含的CSS和JavaScript文件对应的 和