Yii2 — мощный фреймворк, но его настоящая сила раскрывается, когда вы начинаете писать собственные расширения и компоненты. Это как конструктор: вместо того чтобы каждый раз изобретать велосипед, вы создаёте переиспользуемые кубики. В этой статье я расскажу, как это делать правильно, с примерами и без лишней теории.
Что такое компонент и чем он отличается от расширения
В Yii2 компонент — это объект с набором свойств и методов, который можно настроить через конфигурацию. Расширение — это пакет, который вы распространяете через Composer. Компонент может быть частью расширения, а может жить прямо в вашем проекте.
Проще говоря: компонент — это кирпичик, расширение — коробка с кирпичиками. Вы можете использовать компонент только у себя, а расширение — поделиться с миром.
Как создать компонент в Yii2
Компонент создаётся путём наследования от yii\base\Component. Это даёт вам магические геттеры и сеттеры, события и поведение.
Пример простого компонента, который форматирует дату:
namespace app\components;
use yii\base\Component;
class DateFormatter extends Component
{
public $format = 'd.m.Y';
public function format($date)
{
return date($this->format, strtotime($date));
}
}
Теперь его можно использовать в контроллере:
$formatter = new \app\components\DateFormatter(['format' => 'Y-m-d']);
echo $formatter->format('2025-01-01'); // 2025-01-01
Или настроить через конфиг приложения:
// config/web.php
return [
'components' => [
'dateFormatter' => [
'class' => 'app\components\DateFormatter',
'format' => 'd.m.Y',
],
],
];
После этого доступен как Yii::$app->dateFormatter.
Создание расширения для Composer
Расширение — это пакет, который можно установить через composer require. Минимальная структура:
composer.json— описание пакетаsrc/— исходный кодREADME.md— документация
Пример composer.json:
{
"name": "vendor/my-extension",
"description": "Моё расширение для Yii2",
"type": "yii2-extension",
"license": "MIT",
"require": {
"yiisoft/yii2": "~2.0.0"
},
"autoload": {
"psr-4": {
"vendor\\my\\": "src/"
}
}
}
Внутри src/ создайте классы. Например, виджет:
namespace vendor\my\widgets;
use yii\base\Widget;
class HelloWidget extends Widget
{
public $name = 'Гость';
public function run()
{
return $this->render('hello', ['name' => $this->name]);
}
}
И представление views/hello.php:
Привет, = Html::encode($name) ?>!
Теперь расширение можно подключить в приложении и использовать виджет.
Полезные параметры компонентов и расширений
При создании компонентов и расширений важно понимать, какие свойства и методы доступны. Вот таблица с наиболее часто используемыми возможностями.
| Свойство/метод | Где используется | Описание |
|---|---|---|
$behaviors |
Компонент | Массив поведений для добавления функциональности |
on() |
Компонент | Подписка на события |
trigger() |
Компонент | Вызов события |
init() |
Компонент | Инициализация после установки свойств |
render() |
Виджет | Рендеринг представления |
Тестирование и публикация расширения
Перед публикацией расширения обязательно напишите тесты. Yii2 отлично дружит с Codeception. Минимальный тест для виджета:
class HelloWidgetTest extends \Codeception\Test\Unit
{
public function testRender()
{
$widget = new \vendor\my\widgets\HelloWidget(['name' => 'Тест']);
$html = $widget->run();
$this->assertStringContainsString('Привет, Тест!', $html);
}
}
Публикация на Packagist проста: загрузите код на GitHub, добавьте репозиторий на Packagist, и всё. Пользователи смогут установить расширение через Composer.
Не забудьте про семантическое версионирование: мажорные версии для несовместимых изменений, минорные — для новых функций, патчи — для исправлений.
LICENSE и значок статуса сборки (например, Travis CI) в README. Это повышает доверие.
Что в итоге
Создание компонентов и расширений для Yii2 — это не rocket science. Главное — следовать структуре, документировать код и тестировать. Компоненты помогают структурировать приложение, а расширения — делиться кодом с сообществом.
Начните с малого: вынесите повторяющийся код в компонент. Затем оформите его как расширение, если видите потенциал. И не бойтесь публиковать — обратная связь поможет улучшить код.
Студия WNDER


