Yii2 — мощный фреймворк, но его настоящая сила раскрывается, когда вы начинаете писать собственные расширения и компоненты. Это как конструктор: вместо того чтобы каждый раз изобретать велосипед, вы создаёте переиспользуемые кубики. В этой статье я расскажу, как это делать правильно, с примерами и без лишней теории.

Digital-студия WNDER

Что такое компонент и чем он отличается от расширения

В 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:


Привет, !

Теперь расширение можно подключить в приложении и использовать виджет.

Полезные параметры компонентов и расширений

При создании компонентов и расширений важно понимать, какие свойства и методы доступны. Вот таблица с наиболее часто используемыми возможностями.

Свойство/метод Где используется Описание
$behaviors Компонент Массив поведений для добавления функциональности
on() Компонент Подписка на события
trigger() Компонент Вызов события
init() Компонент Инициализация после установки свойств
render() Виджет Рендеринг представления
Лайфхак: Всегда документируйте свойства вашего компонента в PHPDoc. Это упростит использование и поможет другим разработчикам.

Тестирование и публикация расширения

Перед публикацией расширения обязательно напишите тесты. 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