Новости Yii 2021, выпуск 1

    Привет, сообщество!

    Это первый выпуск новостей в 2021. Начало года вышло продуктивным. Мы начали активно релизить пакеты Yii 3, есть значительный прогресс с пока не релизнутыми пакетами. Улучшили инструментарий разработки, много всего исправили, убили лишние пакеты. И всё это параллельно с поддержкой Yii 2 и решением проблем с финансированием.

    Команда и фонд

    Несмотря на то, что 2020 был через край долбанутым, для Yii всё вышло неплохо. Удалось договориться о продлении поддержки Yii 1.1 и других вещах в обмен на единовременное или постоянное пополнение фонда.

    Эти соглашения и, конечно же, наши любимые спонсоры, позволили команде меньше работать над коммерческими проектами и больше над фреймворком. Фонд удалось использовать полностью.

    Я был чрезвычайно воодушевлён возросшей скоростью разработки, окунулся в неё с головой и немного подзабыл о финансовой части. В январе меня ждал неприятный сюрприз. Оказывается, что забыл я про очень важный факт. А именно, что немаленькая часть средств фонда поступила не рекуррентными платежами. Соответственно, бюджета на всё не хватило. Чтобы не случилось полной катастрофы, я перестал забирать деньги фонда с OpenCollective и начал активно искать партнёров среди компаний, которые используют Yii и PHP. Результаты пока спорные, но, надеюсь, всё наладится.

    Если хотите пообщаться на тему партнёрства, пишите в sam@rmcreative.ru.

    Yii 2

    Вышел Yii 2.0.41. Сильно помогли с релизом Paweł Brzozowski, недавно присоединившийся к команде Yii 2, и Robert Korulczyk с его тщательными ревью всего вливаемого в master кода. Много часов было потрачено на безопасность фреймворка. Удалось перебрать текущие сообщения о предполагаемых уязвимостях и улучшить безопасность.

    Yii 3

    Прежде всего, релизы:

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

    Ну а теперь время рассмотреть интересные изменения с предыдущего выпуска новостей. Для удобства изменения сгруппируем по пакетам.

    Arrays

    • Добавлен ArrayHelper::pathExists().

    • Добавлен ArrayHelper::group(). Это алиас ArrayHelper::index().

    • Удалены модификаторы.

    Data

    Auth

    Config plugin

    После большого количества попыток улучшить Composer config plugin стало очевидно что он стал слишком сложным: AST, мёрж конфигов и всё что там творилось под капотом. Мы приняли решение сделать его менее зависимым от пакетов yiisoft и сделать новый, более простой и производительный, пакет.

    Все шаблоны приложений уже были переведены на новые конфиги. Скорее всего нужно будет исправлять баги и повышать удобство использования пакета.

    Error handler

    • Рефакторинг, ридми.

    • Поддержка Xdebug 3 для получения более подробных стектрейсов.

    • ExceptionResponder, при помощи которого можно формировать HTTP-ответ в зависимости от пойманной ошибки. Это может быть полезно для исключений вроде NotFoundException. Будут ли такие исключения из коробки пока обсуждаем.

    • Renderer-ы теперь могут отдавать HTTP-заголовки, добавлен renderer, который выводит ошибку в заголовках. Полезно если показывать ошибки текстом неудобно. Например, для некоторых API или при генерации картинок.

    • Элементы stacktrace для классов из vendor теперь отображаются отдельной группой и по умолчанию свёрнуты. Так как ошибки обычно в самом приложении, это позволяет не отвлекаться на нерелевантную информацию.

    Обработка ошибок в общем

    • В пакет yiisoft/yii-event добавлен режим отладки. В нём проверяются все обработчики событий сразу.

    • Улучшены ошибки DI контейнера.

    Strings

    • Добавлен NumericHelper::isInteger().

    • Добавлена поддержка bool в NumericHelper::normalize().

    • Был переработан матчинг по wildcard. Вместо довольно большого количества опций добавили **, совпадающий, в том числе, с сепараторами.

    Var dumper

    Html

    Пакет был значительно переработан. Главных изменений два:

    1. Вывод по умолчанию экранируется.

    2. Теги реализованы как отдельные объекты, создаваемые через статические методы-фабрики из Html. Для пользователя это значит, что конфигурация теперь производится через вызов методов. То есть теперь IDE это дополняют и проверяют.

    Валидатор

    Много рефакторинга. Самое интересное:

    Формы

    Перевод сообщений

    Почти готов к релизу. Можете почитать его readme.

    Mailer

    Mailer и адаптер для SwiftMailer были вычищены и отрефакторены. Добавлена документация. Релизнем как только будут готовы зависимости.

    DB и ActiveRecord

    В обоих пакетах были исправления, оба ещё больше покрыли тестами. Wilmer, член команды, который занимался этими пакетами, уже проверил их в бою на Telegram боте с 120 тысячами запросов в сутки.

    Оба пакета изначально были портированы из Yii 2 почти как есть. Была убрана магия, добавлены типы, покрытие тестами доведено почти до 100%. Но, несмотря на то что пакеты стали даже лучше, чем Yii 2, дизайн сохранился примерно в том же виде. Нам предстоит трудный выбор, релизить ли первую версию как есть или же сначала затеять гигантский рефакторинг.

    Скорее всего выберем первое.

    yii-web

    User

    Значительно переделали пакет:

    Всё ещё не до конца довольны. Скорее всего будем переделывать ещё.

    Bootstrap и Bulma

    Консоль

    Появилась возможность добавлять команды со своим именем.

    Debugger

    Есть прогресс как в API, так и на фронтенде.

    Docker

    Добавлена поддержка PHP 8.

    Инструментарий разработки фреймворка

    Улучшили инструментарий чтобы можно было удобно работать даже не поставив все пакеты. Улучшили точность фиксера зависимостей. Добавили новую команды release/what. Она подсказываем какой пакет релизить следующим. Приоритет отдаётся пакетам без нестабильных зависимостей и, при этом, блокирующих как можно больше релизов других пакетов.

    Шаблоны приложений

    Новая и обновлённая документация

    Почитать-посмотреть

    ❤️ Спасибо!

    Хочу сказать спасибо всем спонсорам и разработчикам, благодаря которым стала возможна разработка Yii 3. Вместе у нас всё получится.

    Я понял, что ранее не писал о компаниях, которые поддерживают разработку Yii. Вот самые большие спонсоры с коротким описанием:

    • CraftCMS - Отличная OpenSource CMS на Yii2.

    • Onetwist Software - Услуги качественной разработки приложений.

    • SkillShare - Обучение новым навыкам.

    • Betteridge - Ювелирные изделия.

    • dmstr - Облачные решения на основе Docker.

    • HumHub - OpenSource решения для общения команды.

    • JetBrains - Отличные инструменты для разработки.

    • Skin.Club - Рынок скинов для CS:GO.

    • ЭФКО - фудтех, производство продуктов питания, и венчурные инвестиции. С недавнего времени ещё и ЭФКО Цифровые Решения, отдельная растущая сервисная IT-компания, которая планирует заниматься не только внутренними проектами ЭФКО.

    Кроме перечисленных нас поддерживают отдельные разработчики и другие компании.

    Отдельное спасибо тем, кто помог Yii 3 кодом:

    Комментарии 28

      +2

      Отличные новости, ждём пакет с адаптацией CycleORM под Yii3! т.к. нам в Yii2 не хватает полноценной ORM, которая реализована по модели DataMapper. Так-же кому интересно про ЭФКО можно подробней ознакомиться на Хабр.Карьера https://career.habr.com/companies/efko

      –2

      Искренне не понимаю, зачем нужен этот бестолковый фреймворк, напичканный антипаттернами со всех сторон.

        +6

        А можно указать на конкретные антипаттерны в коде Yii 3? Сейчас самое время, успеем поправить, если что.

          +1
          Не критика. У нас админка на Yii2. Должен сказать благодаря виджетам Yii2 это самая гибкая админка, которую я когда-либо видел — можно добавить любую кнопку или список куда угодно. Например админка Битрикс кастомизируется не во всех местах. Есть вопросы и к админке Laravel — Nova, т.к. сильно переделать ее (чтобы один список выглядет по одному, а другой список сущностей — совершенно по-другому) довольно напряжно. Но конечно Enterprise'у надо от фреймворка еще дофига всего кроме этого.
          0
          Улучшены ошибки DI контейнера

          Опечатка .

            0

            Вроде нет.

              +1
              Речь о том, что текст исключений. выкидываемых контейнером, стал более информативен. Так что да, ошибки улучшены :)
              0
              Отлично) Ждем полноценного релиза) Есть вопрос про базовый шаблон. Будет ли какой-то шаблон приложения с примером нормальной архитектуры, типа DDD. Я смотрел ваше видео, где вы говорите, что не делаете такой шаблон, так как для новичков сложно. Но мне как программисту со стажем, но при этом еще только въезжающему в нормальную архитектуру наоборот кажется, что будет полезно посмотреть на нормальную арзитектуру и на ее основе начать учиться это все дело использовать. Сейчас в yii2 (а я сам с него начинал изучение фреймворков в php) большинство разработчиков берут шаблон, который там по умолчанию идет (базовый или продвинутый) и идут по накатанной, делая проекты, которые разрастаясь превращаются в треш-код. Например часть логики пихают в контроллеры, часть в модели AR. При этом мало кто знает, что есть сервисы. А те, кто как я знают, не еще не умеют использовать на практике сталкиваются с проблемой, что посмотреть-то негде. Например, я вообще пока не понимаю, что тут должно быть сервисом, что entity и зачем вообще тогда AR. Вроде entity, если я правильно понимаю концепцию DDD, должны хранить параметры модели, то есть ее свойства и методы. То есть по факту это и есть AR? И вот таких вопросов куча, а хочется какой-то шаблон, который бы помог посмотреть, как это все лучше делать. То есть инструмент вы даете отличный, но чаще всего это как граната в руках обезьяны) Я стараюсь на сколько хватает архитектурных знаний держать код в хорошем виде, но по факту, раз есть такие крутые разработчики, которые могут показать как правильно, то почему бы и не сделать некий шаблон с описанием. Пусть те, кому не нужно качают старый привычный модульный шаблон, пишут в виде transaction script.
                0

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

                  0
                  Понял) Спасибо за труд) Читаю уже сегодня примерно пятую статью на тему DDD, вроде что-то и вырисовывается, но только в рамках концепции, а не реального применения. Буду надеяться, что в документации у вас действительно появится пример того как работать с DDD в рамках Yii3 или Yii2, чтобы можно было на примере посмотреть, что и где использовать)
                    0
                    Пока надеюсь, что найду какой-то полезный материл, например у Дмитрия Елисеева)
                      +1

                      Видел видео от Дмитрия Науменко про DDD. Он по моему тоже участвовал в разработке Yii.

                        0

                        Да, Дмитрий — часть команды основной. Активно участвовал в поддержке и развитии Yii 2.

                    +1
                    Будет ли какой-то шаблон приложения с примером нормальной архитектуры

                    В Yii самая подходящая архитектура такая. Есть контроллеры, в них через DI передаются сервисы, в методах контроллера вызываются методы сервиса, в методы сервиса передается валидированная форма, соответствующая действию которое вы хотите совершить. Для списка например там будет форма с фильтром, для создания/редактирования форма с полями сущности, которые пользователь может ввести в интерфейсе. Сервис это просто ваш класс с логикой обработки, который вы сами написали. Бизнес-логику в сущностях AR не стоит писать, они плохо для этого подходят. Названия полей с переводом тоже, их надо писать в классах форм, а не в классах ActiveRecord, которые в базу сохраняются. Логика в сервисах, валидация в формах. Это удобное правило, которое будет работать в любом фреймворке.

                      0
                      Я пока не только статьи читаю на эту тему, но во многих статьях пишут, что сервисы это типа только для той логики, которая не вписывается в рамки сущностей entity, то есть логика, которую сложно или невозможно отнести к определенной сущности. Приводят в пример проведение перевода денег с аккаунта одного клиента на аккаунт другого. Типа, что сложно сказать куда по логике должен относиться этот метод, то ли к аккаунту, то ли к пользователю и поэтому его делают в отдельном сервисе. Или такой подход, как описывают в статьях на практике не подходит и в сервисы можно и нужно добавлять всю логику работы с сущностями? Или я не правильно вас понял?
                        0

                        Ну я могу сказать только, что "логика в сервисах" это работает. Со временем я пришел к выводу, что так удобнее. Это не только логика, которая затрагивает несколько сущностей, это еще и создание/удаление. Сущность не может сама себя создавать и удалять, значит этот код должен быть где-то еще, а редактирование удобнее делать там же, где и создание. И зависимости в сервисы пробрасывать проще, чем в сущности.

                    +3
                    Yii 3
                    Прежде всего, релизы:
                    В каждом пакете есть документация, отличное покрытие тестами, код вычищен и, конечно же, публичный API достаточно стабилен.

                    Блин, ребята, пока вы Yii 3 делали, я уже 2 работы сменил. На первой из них мы всерьез рассматривали Yii как фреймворк для нового проекта, но решили делать на Laravel, потому что у вас были непонятные перспективы когда вы это всё закончите.


                    Мне кажется, вам надо было бы сделать только ORM и GridView с новой архитектурой, и сразу выпустить первую версию, остальное бы вам сообщество сделало кому что надо. Но вы решили всё делать сами, и это проблема, это непонятные сроки разработки и непонятные перспективы развития.

                      0

                      Александр, какие у вас планы по yii-mongodb? Есть надежда на релиз этого пакета и насколько жестоко он будет связан с основным пакетом ActiveRecord для реляционных бд? По личным впечатлениям yii2-mongodb до сих пор единственная адекватная ORM для работы с монго без существенных костылей.

                        0

                        М… А как же официальный SDK? Костыли?

                          0

                          Если вы про MongoDB PHP Library, то я не могу отнести ее к разряду ORM.

                            0

                            Ясно. Если релиз будет, то будет связан с основным AR. Именно так было в Yii 2.

                        0
                        github.com/yiisoft/cache-apcu/blob/4c9c7e396f5ef830a75f9d8f6558835942e2ee66/src/ApcuCache.php#L200 В прошлых релизах метод что-то делал или какой-то странный кейс?)
                          0

                          Действительно странно. Проверим. Спасибо.

                            0

                            Так и надо:


                            Normalizes keys returned from apcu_fetch() in multiple mode. If one of the keys is an integer (123) or a string representation of an integer ('123') the returned key from the cache doesn't equal neither to an integer nor a string ($key !== 123 and $key !== '123'). Coping element from the returned array one by one to the new array fixes this issue.

                            https://github.com/yiisoft/cache-apcu/pull/20

                            0

                            Спасибо Вам огромное и Картику. Вы с ним не сотрудничаете?

                              0

                              Нет, не сотрудничаем.

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое