Comments 8
Спасибо за ваши старания, позвольте высказать свою критику по поводу архитектурных решений.
'frontend\widgets\MultiLang\components\UrlManager'
Предложенная иерархия директорий (и неймспейсов) не укладывается в хорошие практики. Виджеты — это виджеты, а компоненты — это компоненты. Если у вас есть компонент, а рядом с ним — виджет для работы с этим компонентом, при этом существует общая предметная область, с которой ведется работа — это больше похоже на расширение.
Я бы предложил выделить это в отдельный репозиторий, или (если не планируется переиспользование) — разместить код в вашем проекте таким образом:
frontend\
extensions\
MultiLang\
Components\
UrlManager.php
Views\
View.php
Widgets\
MultiLang.php
содержание файла взято отсюда, можно следовать инструкции разработчика и использовать composer, но мы то делаем виджет, по этому просто скопируем UrlManager.php в наш виджет
Копируя UrlManager.php в свой проект, вы лишаете себя чудесной возможности получать обновления с улучшениями и исправленными ошибками из оригинального репозитория. Отказ от использования composer в пользу копи-пасты — один из самых вредных советов для PHP разработчика в 2016 году.
Что касается кода виджета:
use yii\helpers\Html;
class MultiLang extends \yii\bootstrap\Widget
{
public $cssClass;
public function init(){}
// ...
}
Класс \yii\bootstrap\Widget
находится в отдельном репозитории yii2-bootstrap и наследуется от yii\base\Widget
, добавляя некоторые методы для работы с Frontend-фреймворком Bootstarp. Вы не используете никаких возможностей этого класса, достаточно будет наследования от yii\base\Widget
.
Кроме того, вы указали лишний use
и без какого-либо смысла предопределили метод init()
.
В коде представления вы указали use Yii;
, но каждый раз при обращении к Yii явно указываете namespace:
\Yii::$app->request->get()
Да и если следовать правилам распределения ответственности в MVC, представление не должно "добывать" данные самостоятельно — данные должен собрать тот, кто вызывает рендер представления. Было бы уместно избавится от обращения к компонентам request
, controller
и свойству language
из представления, а перенести это в виджет.
Кроме того, название MultiLang
мне не кажется само-описывающим. Пока не откроешь код, сложно однозначно сказать, что делает этот класс. Что-то про мультиязычность, но что именно?
Я бы его назвал LanguageSwitcher
. Согласитесь, сразу понятно, что это переключатель языков, не так ли?
Если всё таки использовать composer и подключить оригинальное расширение, можно еще больше упростить себе жизнь. Структуру директорий можно свести до такой:
frontend\
widgets\
LanguageSwitcher.php
views\
languageSwitcher.php
И я бы еще упомянул, что вызов этого виджета нужно добавить куда-то в layout, чтобы переключатель где-то отобразился.
Описывать детально желания нет, ибо для адекватных людей это очевидно.
А зомбостадо никаких аргументов не услышит.
:)
Зомбоящик рулит?
PS. если что, я вообще в «другой стороне света» живу ), просто взгляд со стороны…
Ну и что Вы изучили, что мне нравится неунылое? :)
Писать комменты, чтобы залезли мне в профиль? :)
О да, верх логики. :)
Как-то тупо обвинять человека, который выступает против унылых трендов в зомбоящичестве. В зомбоящике как раз унылые тренды и формируют.
Вдруг что, майданутость терпеть не могу. Но это оффтоп, прошу о майданутости дальше не продолжать.
Виджет мультиязычности в YII2 без использования базы данных