Создание собственного виджета в Yii 2.x

Представим, что у нас на сайте есть новостная лента, каталог организаций, видео лента и т.д. Для каждой новости, организации, видео необходимо сформировать человеко-понятную ссылку английскими буквами. На входе мы возьмем заголовок новости, название организации, название видео, на выходе у нас должна получиться транслитерационная ссылка без пробелов. Итак, так как эта функция будет использоваться в разных местах сайта, то логично вынести программный код в отдельный виджет.

Создадим в папке components файл TranslitWidget.php. Напишем следующий программный код.

// подключаем пространство имен
namespace app\components;
// импортируем класс Windget и Html хелпер
use yii\base\Widget;
use yii\helpers\Html;
// расширяем класс Widget
class TranslitWidget extends Widget
{
    public $url;
    // функция описывает определенные действия
    public function init(){
        parent::init();
            // устанавливаем кодировку 
            mb_http_input('UTF-8');
            mb_http_output('UTF-8');
            mb_internal_encoding("UTF-8");
            
            $this->url = (string )$this->url; // преобразуем в строковое значение
            $this->url = strip_tags($this->url); // убираем HTML-теги
            $this->url = str_replace(array("\n", "\r"), " ", $this->url); // убираем перевод каретки
            $this->url = preg_replace("/\s+/", ' ', $this->url); // удаляем повторяющие пробелы
            $this->url = trim($this->url); // убираем пробелы в начале и конце строки
                        
            $this->url = function_exists('mb_strtolower') ? mb_strtolower($this->url) : strtolower($this->url); // переводим строку в нижний регистр (иногда надо задать локаль)
            $this->url = strtr($this->url, array('а' => 'a','б' => 'b','в' => 'v','г' => 'g','д' => 'd','е' => 'e','ё' => 'e','ж' => 'j','з' => 'z','и' => 'i','й' => 'y','к' => 'k',
                'л' => 'l','м' => 'm','н' => 'n','о' => 'o','п' => 'p','р' => 'r','с' => 's','т' => 't','у' => 'u','ф' => 'f','х' => 'h','ц' => 'c','ч' => 'ch','ш' => 'sh','щ' => 'shch',
                'ы' => 'y','э' => 'e','ю' => 'yu','я' => 'ya','ъ' => '','ь' => ''));
            $this->url = preg_replace("/[^0-9a-z-_ ]/i", "", $this->url); // очищаем строку от недопустимых символов
            $this->url = str_replace(" ", "-", $this->url); // заменяем пробелы знаком минус
    }
    // возвращаем результат
    public function run(){
        return Html::encode($this->url);
    }
}

Для вызова виджета напишем следующий код:

// подключаем виджет
use app\components\TranslitWidget;
....
// к примеру это заголовок новости
$titleNews = "Моя первая новость";  
// виджет возвращает транслит этой новости а именно moya-pervaya-novost
echo TranslitWidget::widget(['url' => $titleNews ]);