12Расширения и сторонний код
Как ставить расширения через Composer, как оформить своё (composer.json, bootstrap-класс, ресурсы, миграции), список официальных расширений и как подружить Yii с чужими библиотеками и системами.
Расширение — Composer-пакет типа yii2-extension: виджеты, модули, хелперы, компоненты. Устанавливается одной командой, автозагружается сам, при необходимости регистрирует свой bootstrap-код. Обычные библиотеки (не для Yii) подключаются так же через Composer.
Установка#
composer require yiisoft/yii2-imagine "~2.0.0"use yii\imagine\Image;
Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)
->save(Yii::getAlias('@runtime/thumb.jpg'), ['quality' => 50]);Composer обновляет vendor/yiisoft/extensions.php — из него приложение узнаёт о расширениях, их псевдонимах и bootstrap-классах. Классы загружаются автозагрузчиком без настройки.
Вручную, без Composer#
Распаковать в vendor/, подключить автозагрузчик библиотеки (если есть) или объявить псевдоним для PSR-4-совместимого кода:
'aliases' => ['@myext' => '@vendor/mycompany/myext'], // классы myext\Foo → vendor/mycompany/myext/Foo.phpОфициальные расширения#
yii2-debug (панель отладки), yii2-gii (генератор кода), yii2-apidoc (документация API), yii2-faker (тестовые данные).
yii2-bootstrap / yii2-bootstrap4 / yii2-bootstrap5 (виджеты Bootstrap), yii2-jui (jQuery UI).
yii2-redis, yii2-mongodb, yii2-elasticsearch, yii2-sphinx: Active Record, кеш, сессии для NoSQL-хранилищ.
yii2-httpclient (HTTP-клиент), yii2-authclient (OAuth: Google, GitHub, Facebook…), yii2-symfonymailer / yii2-swiftmailer (почта), yii2-imagine (картинки).
yii2-twig, yii2-smarty.
Все — yiisoft/yii2-* на Packagist; каталог сообщества: yiiframework.com/extensions.
Своё расширение#
- Репозиторий +
composer.json. Имяvendor/yii2-name, типyii2-extension, зависимость отyiisoft/yii2, автозагрузка PSR-4. - Пространство имён
vendor\name(без префиксаyii2-). Словаyii,yii2,yiisoftв качестве vendor зарезервированы. - Регистрация на Packagist (или в своём репозитории Composer для приватных пакетов), теги версий по semver.
{
"name": "myname/yii2-mywidget",
"type": "yii2-extension",
"description": "Виджет для…",
"license": "BSD-3-Clause",
"require": {
"yiisoft/yii2": "~2.0.0"
},
"autoload": {
"psr-4": {"myname\\mywidget\\": "src/"}
},
"extra": {
"bootstrap": "myname\\mywidget\\Bootstrap"
}
}Для каждого корневого пространства имён из autoload Yii создаст псевдоним (@myname/mywidget).
Bootstrap-класс#
Код, который должен выполняться при старте каждого запроса (регистрация URL-правил, обработчиков событий, зависимостей DI), выносят в класс с BootstrapInterface и указывают в extra.bootstrap:
namespace myname\mywidget;
use yii\base\Application;
use yii\base\BootstrapInterface;
class Bootstrap implements BootstrapInterface
{
public function bootstrap($app)
{
$app->on(Application::EVENT_BEFORE_REQUEST, function () {
// ...
});
\Yii::$container->set('myname\mywidget\StorageInterface', 'myname\mywidget\FileStorage');
}
}Рекомендации авторам#
- База данных: не полагайтесь на
Yii::$app->db— объявите свойствоdb(как уyii\caching\DbCache), чтобы пользователь мог подставить своё соединение. Схему меняйте миграциями, без Active Record внутри них. - Ресурсы: объявляйте пакет ресурсов с
sourcePath— публикация сделает файлы доступными из веба сама. - i18n: пользовательские строки оборачивайте в
Yii::t(), числа и даты форматируйте черезFormatter. - Тесты, changelog, readme, upgrade.md, документированный код в стиле ядра.
Сторонние библиотеки в Yii#
Пакеты Composer работают сразу — автозагрузчик vendor/autoload.php подключён во входном скрипте. Для библиотек без Composer:
- есть свой автозагрузчик — подключить его во входном скрипте до
Yii.php; - классы по PSR-4 — объявить псевдоним корневого пространства имён (
'@xyz' => '@vendor/foo/bar'); - совсем без автозагрузки — заполнить карту классов:
Yii::$classMap['Class1'] = 'path/to/Class1.php'.
Yii внутри другой системы#
Active Record, хелперы, кеш и прочее можно использовать в WordPress, Joomla или приложении на другом фреймворке:
composer require yiisoft/yii2require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
$yiiConfig = require __DIR__ . '/../config/yii/web.php';
new yii\web\Application($yiiConfig); // НЕ вызывать run(): обработка запроса остаётся за хост-системойПосле этого доступен Yii::$app со всеми компонентами из конфигурации — например, db с настройками базы хост-системы. Если ресурсы (Bower/NPM) не нужны, пригодится пакет cebe/assetfree-yii2.
Yii 2 рядом с Yii 1#
Оба фреймворка используют класс Yii, поэтому нужен объединённый класс: наследник yii\BaseYii, куда скопирован код YiiBase из 1.x. Затем во входном скрипте создаётся приложение Yii 2 (без run()), а Yii 1 запускается как обычно. В коде: Yii::$app — приложение Yii 2, Yii::app() — Yii 1. Полный рецепт — в главе руководства «Работа со сторонним кодом».
При установке Composer добавит его в vendor/yiisoft/extensions.php, и Yii узнает о псевдонимах и bootstrap-классе расширения автоматически.
Через класс, реализующий BootstrapInterface, указанный в extra.bootstrap файла composer.json.
Пользователь может держать данные в другом соединении; правильно — объявить настраиваемое свойство db компонента.
Создать new yii\web\Application($config), но не вызывать run() — обработкой запроса занимается хост-система.