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

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

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

  • Работа с публикуемыми ресурсами
  • Работа с web доступными ресурсами
  • Подключение ресурсов
  • Управление ресурсами-изображениями

Пакет ресурсов реализуется путем расширения класса 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 = [

      'js/some-script.js'

    ];

 

    // путь к CSS файлам относительно sourcePath

    public $css = [

        '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 = [

      'js/some-script.js'

    ];

 

    // путь к CSS файлам относительно basePath

    public $css = [

        '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 отвечает класс yii\i18n\I18N. Данные локазиции могут зраниться как в БД так

Yii2 Возможность: темы

Тема - это каталог с файлами видов контроллеров (views) и шаблонов (layouts). Каждый файл в

Yii2 basic на разделяемом хостинге

При установке на разделяемый хостинг часто нет возможности прописать директиву DocumentRoot чтобы избавиться от префикса