Yii2: Работа с ресурсами
В данной статье разбираются варианты создания менеджера ресурсов в Yii2 и их использование, а так же рассматривается способ работы с ресурсами-изображениями.
- Работа с публикуемыми ресурсами
- Работа с web доступными ресурсами
- Подключение ресурсов
- Управление ресурсами-изображениями
Пакет ресурсов реализуется путем расширения класса yii\web\AssetBundle. Есть два варианта работы с пакетами ресурсов:
- Файлы ресурсов изначально находятся в web НЕ доступной директории, и при запросе сначала их нужно сначала опубликовать т.е. переместить в web доступную директорию. Как правило это директории внутри @app/web. Затем русурсы нужно подключить в нужных видах, или получить путь для обращения к ним из браузера. (в данном случае используем AssetBundle::$sourcePath)
- Файлы ресурсов изначально находятся в web доступной директории и никуда их копировать/публиковать не нужно, а нужно просто подключить их к нужному виду, или получить путь для обращения к ним из браузера. (в данном случае используем AssetBundle::$baseUrl и AssetBundle::$sourcePath)
AssetBundle::$sourcePath и AssetBundle::$basePath - могут использовать псевдонимы путей
Yii2: Работа с публикуемыми ресурсами (вариант 1)
Разберем первый случай, когда файлы находятся в web не доступной директории, и их нужно публиковать. Предположим мы разрабатываем модуль "mymodule", который использует какие то ресурсы (js, css и картинки).
Схема файловой системы mymodule, начиная от @app/modules:
... |-mymodule | |-controllers |-models |-views |-assets | | | | | |-images | | |-some-image.jpg | | | |-js | | |-some-script.js | | | |-css | |-some.css | |-MyAssetsBundle.php |-Module.php
Тогда класс ресурсов MyAssetsBundle.php будет иметь такое содержимое:
<?php namespace app\modules\mymodule; class MyAssetsBundle extends AssetBundle { // путь к директории, содержимое которой надо опубликовать public $sourcePath = '@app/modules/mymodule/assets'; // путь к JS файлам относительно sourcePath public $js = [ '/yii2-cheatsheets/146-yii2-asset-bundle.html/js/some-script.js' ]; // путь к CSS файлам относительно sourcePath public $css = [ '/yii2-cheatsheets/146-yii2-asset-bundle.html/css/some.css' ]; }
Заметьте про картинки мы тут не упоминаем.
Yii2: Работа с web доступными ресурсами (вариант 2)
Разберем второй случай, когда файлы находятся в web доступной директории, и их НЕ нужно публиковвывать. Это бывает например, когда вы просто подключаете в проект дополнительные скрипты, или css, которые предполагается использовать для множества видов различных контроллеров, или даже модулей. Имеет смысл подрубить такой Пакет ресурсов что называется на "верхнем уровне". У Yii2 уже есть на этот случай директория @app/assets можно закинуть туда:
application | |-assets | | | |- ... | |-MyAssetsBundle.php | |- ... куча других файлов и директорий ... | |-web | |- ... |-my-resource-pack | | |-images | |-some-image.jpg | |-js | |-some-script.js | |-css |-some.css
Тогда класс пакета ресурсов может выглядеть следующим образом:
<?php namespace app\modules\mymodule; class MyAssetsBundle extends AssetBundle { // Путь в файловой системе до директории ресурсов public $basePath = '@app/web/my-resource-pack'; // Путь из web до директории ресурсов public $baseUrl = '/my-resource-pack'; // путь к JS файлам относительно basePath public $js = [ '/yii2-cheatsheets/146-yii2-asset-bundle.html/js/some-script.js' ]; // путь к CSS файлам относительно basePath public $css = [ '/yii2-cheatsheets/146-yii2-asset-bundle.html/css/some.css' ]; }
Подключение ресурсов
Подключить ресурсы можно разными способами. В контроллере:
<?php ... public function actionIndex() { ... // регистрируем вид контроллера: \app\modules\mymodule\MyAssetsBundle::register($this->view); // можно и так: // Yii::$app->getAssetManager()->getBundle('\app\modules\mymodule\MyAssetsBundle')->register($this->view); ... return $this->render('index'); } ...
Данное действие подключит на странице вида 'index' указанные в пакете ресурсы: js/test.js и css/styles.css Так же, после этого действия, ссылка на \app\modules\mymodule\MyAssetsBundle будет доступна в методах контроллера и в файле вида через:
$this->assetBundles['\app\modules\mymodule\MyAssetsBundle'];
Можно регистрировать "вид" сразу в файле вида:
$this->getAssetManager() ->getBundle('\app\modules\mymodule\MyAssetsBundle') ->register($this);
Управление ресурсами-изображениями
Для работы с изображениями в html атрибуте src нам необходимо указать путь в ту самую web доступную директорию, где в итоге оказываются ресурсы. Данный путь - это путь из web т.е. тот самый \app\modules\mymodule\MyAssetsBundle::baseUrl + 'images' для нашего случая.
В файле вида:
... $bundle = $this->getAssetManager()->getBundle('\app\modules\mymodule\MyAssetsBundle'); ?> <img src="/<php echo $bundle->baseUrl ?>/images/some-image.jpg" /> ...
Кстати! Для варианта, когда пакеты "публикуются", путь \app\modules\mymodule\MyAssetsBundle::baseUrl предваряется префиксом - директорией, содержащей опубликованные файлы пакета, которая генериться при публикации пакета. Её имя генерится уникальным образом и каждый раз по-разному, но нас это уже не особо волнует - мы просто используем его и все.
Остальные нюансы более очевидны, информацию по ним можно посмотреть здесь: Yii2 документация на русском: Ресурсы