Виджеты в yii2 в основном нужны в том случае, когда один блок используется на нескольких разных страницах (например меню сайта).

В виджет классе доступны пара методов:
init и run.

Метод init — инициализация и нормализация свойств виджета.
Метод run — возврат результата работы.

На примере создадим свой виджет.

Создаем папку /components.
В ней создадим наш виджет (MyWidget), фаил MyWidget.php.
Также создадим папку views (в ней будут храниться шаблоны наших виджетов, если они нам понадобятся).
В папке views создатим вид нашего виджета, фаил my.php.

Код вида (my.php)

Код:

<h1>Привет, дорогой <?= $name ?>!</h1>

Код виджета.

Код:

<?php

namespace app\components;
use yii\base\Widget;

class MyWidget extends Widget {

    publick $name;

    public function init(){
        parent::init();
        if($this->name === null) $this->name = 'Гость';
    }
    public function run(){
        return $this->render('my', compact('name'));
    }

}

Осталось вывести нашь виджет в нужном месте нашего вида (шаблона).

Для этого, подключим сам виджет.

use app\components\MyWidget;

И выведем его в нужном нам месте.

<?php echo MyWidget::widget([‘name’ => ‘Вася’]); ?>

Так-же с помощью виджета мы можем обрабатывать нужную информацию, нужным нам способом.

Например мы сделать выджет который будет выводить данный ему текст в верхний регистр (загланые буквы).

В этом случае код виджета будет выглядеть так

Код:

<?php

namespace app\components;
use yii\base\Widget;

class MyWidget extends Widget {

    publick $name;

    public function init(){
        parent::init();
        ob_start(); // буферизация поступившых данных
    }
    public function run(){
        $content = ob_get_clean(); //получаем данные из буфера
        $content = mb_strtoupper($content, 'utf-8'); // преобразовываем в верхний регистр
        return $this->render('my', compact('content'));
    }

}

в виде my.php просто выведем наш контент

<?= $content ?>

И теперь в основном шаблоне используем данный виджет по назначению

Код:

<?php MyWidget::begin() ?>
    <h1>привет, мир!</h1>
<?php MyWidget::end() ?>

В итоге в месте расположения виджета выведется

ПРИВЕТ, МИР!