Yii 2.0.12

    Вышла версия 2.0.12 PHP фреймворка Yii. Инструкции по установке и обновлению ищите здесь.



    Версия 2.0.12 является минорным релизом Yii 2.0. Она включает в себя более сотни улучшений и исправлений.


    В релиз вошли несколько изменений, которые могут повлиять на существующие приложения. Эти изменения описаны в UPGRADE.md.


    Спасибо сообществу Yii за поддержку проекта!


    За разработкой фреймворка можно следить поставив звёздочку на GitHub. Также можно подписаться на Twitter и Facebook.


    Данный релиз задержался, потому как команда была занята другими вещами. Например, мы работаем над новым сайтом и YiiConf
    — конференции по Yii
    , которая пройдёт совсем скоро в Москве.


    Так как Yii 2.1 уже разрабатывается, убедитесь, что версия в вашем composer.json прописана как ~2.0.12, а не >= или *. Так, при релизе 2.1, ваш проект точно не сломается.


    Ниже мы рассмотрим самые интересные изменения релиза. Полный список можно посмотреть в CHANGELOG.


    Тесты


    Покрытие тестами очень важно для своевременного обнаружения проблем. К релизу @vladis84, @boboldehampsink, @Kolyunya и другие члены сообщества Yii помогли нам расширить покрытие кода.


    @schmunk42 настроил дополнительное тестирование на базе docker и развернул его в GitLab. Некоторые тесты там всё ещё падают. Главным образом, из за отличий в данных для интернационализации. Это будет исправлено немного позже.


    Базы данных


    Слой работы с базами получил несколько улучшений в работе с выражениями. Теперь их можно использовать в \yii\db\QueryTrait::limit(), \yii\db\QueryTrait::offset() и \yii\data\Sort.


    MSSQL


    Поддержка MSSQL существенно улучшилась. Значительно возросла скорость чтения схемы и был реализован метод yii\db\mssql\QueryBuilder::resetSequence().


    Безопасность


    • yii\base\Security::hkdf() был улучшен. Теперь, если это возможно, используется hash_hkdf() из PHP >= 7.1.2.
    • В yii\captcha\CaptchaAction теперь используется mt_rand() вместо rand() .

    Юзабилити


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


    Различные компоненты фреймворка обзавелись значениями по умолчанию:


    • \yii\data\SqlDataProvider теперь считает записи самостоятельно в том случае, когда totalCount не указан.
    • Провайдеры данных автоматически выставляют ID. Больше нет необходимости указывать его для случая, когда несколько провайдеров с постраничной разбивкой используется на одной странице.
    • Фильтр для yii\grid\DataColumn автоматически генерится как выпадающий список в том случае, если format выставлен в boolean.

    Команда yii cache начала предупреждать о том, что она не может очистить кеш APC из консоли.


    yii\filters\AccessRule теперь позволяет передать параметры в функцию проверки роли.


    Производительность


    • В yii\web\UrlManager добавлена поддержка кеширования вызовов yii\web\UrlRule::createUrl() в случае использования правил с умолчаниями.
    • В DB command Добавлена опция для отключения логирования и профайлинга.
    • yii\data\ActiveDataProvider не делает запросы в том случае, когда количество моделей равно нулю.

    Всякое


    StringHelper научился работать с URL-безопасным base64 через методы encode()/decode(). Это может быть полезно для различных токенов.


    yii\helpers\Html::img() теперь позволяет указать srcset:


    [php]
    echo Html::img('/base-url', [
        'srcset' => [
            '100w' => '/example-100w',
            '500w' => '/example-500w',
            '1500w' => '/example-1500w',
        ],
    ]);

    У yii\widgets\LinkPager можно рендерить кнопку текущей страницы как disabled. Для этого необходимо выставить disableCurrentPageButton в true.


    Контроль доступа и валидаторы стали требовать меньше зависимостей:


    • yii\filters\AccessControl теперь может использоваться без компонента user.
    • Валидаторы больше не требуют Yii::$app.
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 27
    • +2
      Вот за:
      В DB command Добавлена опция для отключения логирования и профайлинга.
      отдельное спасибо! В дебаг режиме после 1к запросов они начинали дико тупить.
      • 0
        Расскажите, пожалуйста, что за задача требует выполнения 1к запросов в базу?
        • 0

          Фоновый импорт-экспорт, например.

          • 0
            А почему нельзя использовать batch insert? Или предполагается тысяча insert'ов по n^1024 строк? Тогда на мой взгляд дебаггер такому фоновому обработчику не нужен. Дебажить его можно прямо в консоли, а если нужно логировнаие, то это задача не дебаггера.
            • 0

              Да, 1000 по n^1024. Довольно типично. На тему дебажить или нет — согласен.

              • 0
                Я не говорил, что не нужно дебажить ) Я имел ввиду, что дебаг панель для этого не подходит. Страница со списком запросов будет весить чуть больше, чем весят сами данные. И при 1000 инсертов по n^1024 строк, этой страницей просто будет невозможно воспользоваться.
              • +1
                Потому что нет batch update. Мне приходится обновлять огромное кол-во отдельный сущностей. Чтобы избежать блокировок обновляю по одной без транзакций.

                Да и не в этом дело. Фоновые задачи (а у меня как раз импорт данных) могу выполнять огромное кол-во простых задач. Я разрабатываю локально и у меня естественно включен дебаг режим. Поэтому нормально протестировать производительность большого кол-ва запросов не получается. Замедление видно уже после 30 секунд работы. И я не использую ни логи, ни профайлинг базы в консоли. Добавленная же возможность позволяет их навсегда отключить. Что я уже и сделал. Ещё раз спасибо разработчикам.
        • +2
          Шаблон миграций теперь по умолчанию использует safeUp() и safeDown()

          Каждый раз как генерирую миграции вспоминаю про это, и каждый раз думаю о том что надо сделать свой шаблон :)
          • +1
            Специфичная ошибка: У меня в YII_DEBUG режиме. К rest массиву, прицевляются все SQL запросы и время их выполнения.
            $sqls = Yii::getLogger()->getProfiling(['yii\db\Command::query', 'yii\db\Command::execute']);
            

            Этот код вызывает ошибку
            md5() expects parameter 1 to be string, array given
            /yiisoft/yii2/log/Logger.php
            line 281
            


            • 0

              Уверены что ошибка — кидайте в issue на github.

          • +3
            В yii\captcha\CaptchaAction теперь используется mt_rand() вместо rand()

            Уж раз менять такие вещи — то почему бы сразу не использовать везде random_int() или random_bytes()? Давно и полифилл есть — paragonie/random_compat.


            Хотя для капчи несущественно, конечно.

            • 0

              В 2.1 будет random_int().

              • 0

                Возможно, будет даже раньше.

            • +1
              Спасибо Вам за столь великолепный фреймворк и его русскоязычную поддержку!
              • +1
                В yii\web\UrlManager добавлена поддержка кеширования вызовов

                Спасибо большое, а то раньше приходилось кешировать ручками)

                • 0
                  Фильтр для yii\grid\DataColumn автоматически генерится как выпадающий список в том случае, если format выставлен в boolean.

                  Лучше бы как чекбокс, но селект тоже неплохо.
                  • +2
                    Извините, а как вы себе чекбокс там предаставляете?
                    Как по мне селект самое то.
                    Спасибо!
                  • 0
                    Спасибо вам! А когда релиз 2.1?
                  • –4
                    После обновления на 2.0.12 слетели exist валидации. БУДЬТЕ ОСТОРОЖНЫ!
                    Долго грешили на свои ошибки, но откатились до 2.0.11 и там все нормально. Смотрели diff. У вас там есть правки связанные с названием таблицы. Писать issue нет сейчас времени, если есть возможность — посмотрите.
                    • +3

                      Что именно смотреть? Как именно слетели? Как были прописаны правила?

                      • 0
                        В проекте нужна проверка поля на уникальность без учета регистра. Раньше в модели в rules добавляли следующий код:
                        [['some_column_name'], 'unique', 'targetAttribute' => ['SomeColumnNameLower' => 'lower(some_column_name)']],
                        ...
                        public function getSomeColumnNameLower()
                        {
                            return mb_strtolower($this->some_column_name);
                        }
                        

                        В новой версии были добавлены функции prefixConditions и applyTableAlias:
                        https://github.com/yiisoft/yii2/blob/master/framework/validators/UniqueValidator.php#L291
                        и теперь получается SQL запрос вида
                        SELECT * FROM some_table WHERE some_table.[[lower(some_column_name)]]=''
                        

                        запрос падает с ошибкой.
                        • 0

                          Закиньте на GitHub, если ещё не закинули. Посмотрим и, если надо, исправим.

                      • +4

                        Черкануть на GitHub способ воспроизведения и упомянуть предполагаемую причину — это до 10 минут времени, которые сэкономят десятки часов других разработчиков, которые могут столкнуться с той же проблемой.


                        Искренне не понимаю, как можно было обнаружить ошибку, поискать ее причину в своём проекте, посмотреть diff'ы кода фреймвока, найти там предполагаемую причину и потом перечеркнуть все потраченные усилия, не открыв issue.

                        • +2
                          Не могу подтвердить. У меня ничего не слетело после обновления. Exist используется.
                        • +1
                          yii\filters\AccessRule теперь позволяет передать параметры в функцию проверки роли.

                          Это просто прелестно! Всё время чувствовал легкие сомнения и неудобства, используя ActionFilter для проверки прав…

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