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 документация на русском: Ресурсы
Yii2: Работа с ресурсами