Yii2: Работа с ресурсами

Yii2: Работа с ресурсами

В данной статье разбираются варианты создания менеджера ресурсов в Yii2 и их использование, а так же рассматривается способ работы с ресурсами-изображениями.

Пакет ресурсов реализуется путем расширения класса yii\web\AssetBundle. Есть два варианта работы с пакетами ресурсов:

  1. Файлы ресурсов изначально находятся в web НЕ доступной директории, и при запросе сначала их нужно сначала опубликовать т.е. переместить в web доступную директорию. Как правило это директории внутри @app/web. Затем русурсы нужно подключить в нужных видах, или получить путь для обращения к ним из браузера. (в данном случае используем AssetBundle::$sourcePath)
  2. Файлы ресурсов изначально находятся в 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 документация на русском: Ресурсы

Добавить комментарий


Защитный код
Обновить


Кто на сайте
Сейчас 6 гостей онлайн